WindowsXP/Source/XPSP1/NT/base/wmi/enumguid/eguid.c

934 lines
20 KiB
C
Raw Normal View History

2024-08-03 16:30:48 +02:00
/************STARTDOC*********************************************************
*
* Copyright (c) 1997-1999 Microsoft Corporation
* mofcall.c
*
* This file contains the functions used to gather infomation about
* the various wmi providers registered with the system. Infomation
* can be gathered from the .mof file. Then this information can be
* used to query the actual provider.
*
*
* Modification History:
* --------------------
*
* Drew McDaniel (drewm) - Sept. 16, 1997 - Original Source
*
*
*************ENDDOC**********************************************************/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <ole2.h>
#include <wmium.h>
#include <tchar.h>
#include "print.h"
// Defined constants
//
#define MAX_DATA 200
// Modular Data
//
// Function Prototypes
//
extern ULONG
WMIAPI
WmiEnumerateGuids(
OUT LPGUID GuidList,
IN OUT ULONG *GuidCount
);
BOOL
PrintAllGuids(
LPGUID *GuidList,
LPDWORD lpdwGuidCount
);
DWORD
GetGuidList(
OUT LPGUID *ppGuidList
);
VOID
UseGuid(
LPGUID lpGuid
);
VOID
QueryWnodeAllData(
LPGUID lpGuid
);
VOID
QueryWnodeSingleInstance(
LPGUID lpGuid
);
VOID
SetWnodeSingleInstance(
LPGUID lpGuid
);
VOID
SetWnodeSingleItem(
LPGUID lpGuid
);
//+----------------------------------------------------------
//
// Function: Main
//
// Descrip: This is the starting function. It will call
// a routine to print all of the guids and a short
// description. Then the user may select one of
// the guids and get more mof infomation, call one
// of the WMI query APIs, or call one of the WMI set
// APIs
//
// Returns: Only returns upon program exit
//
// Notes: Initially this is just going to be a text based
// tool. The hope is that this could later be
// modified into a (possibly more useful) GUI based
// tool.
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
int _cdecl main(int argc, LPSTR *argv[])
{
DWORD dwRet = 0;
LPGUID GuidList = NULL;
DWORD dwGuidCount = 0;
DWORD dwResponse = 0;
DWORD dwGuidIndex = 0;
BOOL bContinue = TRUE;
while (bContinue == TRUE)
{
// Print all of the registered guids
//
PrintAllGuids(&GuidList, &dwGuidCount);
// Check to see which guid to query
//
printf("\n\nSelect a guid to examine (0 to exit): ");
scanf("%u", &dwResponse);
printf("\n\n");
if (dwResponse == 0)
{
bContinue = FALSE;
}
else
{
dwGuidIndex = dwResponse - 1;
if (dwGuidIndex < dwGuidCount)
{
// Clear screen and then allow the user to play
// with the selected guid.
//
UseGuid( &(GuidList[dwGuidIndex]) );
}
else
{
printf("Invalid guid %u\n", dwResponse);
Sleep (2000);
ClearScreen();
}
}
// Free the list of guids to clean up for the next call
//
if (GuidList != NULL)
{
free(GuidList);
GuidList = NULL;
}
}
return(TRUE);
}
//+----------------------------------------------------------
//
// Function: PrintAllGuids
//
// Descrip: First we get a list of all of the guids register
// with the system. This list is based on the
// information that a provider exposes in its .mof
// file. If a providers .mof file is incorrect or
// if the provider does not have a .mof file then
// its guids will not be accessable by this program.
//
// Returns: TRUE always
//
// Notes: If no guids are registered then this app will
// be terminated.
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
BOOL
PrintAllGuids(
LPGUID *GuidList,
LPDWORD lpdwGuidCount
)
{
UINT index;
// Get the list of guids. Exit if no guids are registered.
//
*lpdwGuidCount = GetGuidList( GuidList );
if (*lpdwGuidCount == 0)
{
printf("No Guids are registered\n");
exit(0);
}
// Print each guid index, actual guid, and the description
// of the guid.
//
for (index = 0; index < *lpdwGuidCount; index++)
{
printf("Guid %u: ", index + 1);
PrintGuid(&((*GuidList)[index]));
printf("\n");
//No Mof Stuff
// PrintDescription(&((*GuidList)[index]));
printf("\n");
}
return (TRUE);
}
//+----------------------------------------------------------
//
// Function: GetGuidList
//
// Descrip: This function will first query to determine how
// many WMI guids are currently registered. Then
// it will allocate space for the guids and query
// the system for the actual list of guids.
//
// Returns: The number of guids registered on the system based
// on the infomation provided in each providers .mof
// file.
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
DWORD
GetGuidList(
OUT LPGUID *ppGuidList
)
{
DWORD dwGuidCount = 0;
DWORD dwRet;
GUID Guid;
// Determine the present number of guids registered
//
dwRet = WmiEnumerateGuids( &Guid,
&dwGuidCount);
if (dwRet != ERROR_MORE_DATA)
{
printf("Call to determine number of Guids failed. (%u)\n", dwRet);
return (0);
}
// Return if there are no guids registered
//
if (dwGuidCount != 0)
{
// Allocate buffer for Guids. Note: we will allocate room for
// and extra 10 Guids in case new Guids were registed between the
// previous call to WMIMofEnumeratGuid, and the next call.
//
dwGuidCount += 10;
*ppGuidList = (LPGUID) malloc (dwGuidCount * sizeof(GUID));
if (*ppGuidList == NULL)
{
printf("Out of Memory Failure. Unable to allocate memory"
" for guid list array\n");
return (0);
}
// Get the list of Guids
//
dwRet = WmiEnumerateGuids( *ppGuidList,
&dwGuidCount);
if ((dwRet != ERROR_SUCCESS) && (dwRet != ERROR_MORE_DATA))
{
printf("Failure to get guid list. (%u)\n", dwRet);
return 0;
}
}
return (dwGuidCount);
} // GetGuidList
//+----------------------------------------------------------
//
// Function: UseGuid
//
// Descrip: This function will ask the user what operation
// they would like to do to the selected guid.
//
// Returns: VOID
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
VOID
UseGuid(
LPGUID lpGuid
)
{
DWORD dwSelection = 0;
while (1)
{
ClearScreen();
printf("Guid: ");
PrintGuid( lpGuid );
printf("\n");
printf("1.) Query for the full Wnode\n");
printf("2.) Query a single instance\n");
printf("3.) Set a single instance\n");
printf("4.) Set a single item\n");
printf("0.) Back to previous screen\n");
printf("\nMake selection: ");
scanf("%u", &dwSelection );
printf("\n");
switch (dwSelection)
{
case 0:
ClearScreen();
return;
case 1:
ClearScreen();
QueryWnodeAllData( lpGuid );
break;
case 2:
ClearScreen();
QueryWnodeSingleInstance( lpGuid );
break;
case 3:
ClearScreen();
SetWnodeSingleInstance( lpGuid );
break;
case 4:
ClearScreen();
SetWnodeSingleItem( lpGuid );
break;
default:
printf("Invalid Selection.\n");
WaitForUser();
break;
}
}
} // UseGuid
//+----------------------------------------------------------
//
// Function: SelectInstanceName
//
// Descrip: This function will prompt the user to select one of the
// instances of the guid to use.
//
// Returns: VOID
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
SelectInstanceName(
LPGUID lpGuid,
LPTSTR lpInstanceName,
LPDWORD lpdwNameSize
)
{
HANDLE hDataBlock;
BYTE Buffer[4096];
DWORD dwBufferSize = 4096;
DWORD dwRet;
DWORD dwInstanceNumber;
LPDWORD NameOffsets;
BOOL bContinue = TRUE;
USHORT usNameSize;
UINT iLoop;
LPTSTR lpStringLocal;
PWNODE_ALL_DATA pWnode;
// Get the entire Wnode
//
dwRet = WmiOpenBlock( lpGuid,
0,
&hDataBlock
);
if (dwRet == ERROR_SUCCESS)
{
dwRet = WmiQueryAllData( hDataBlock,
&dwBufferSize,
Buffer);
if ( dwRet == ERROR_SUCCESS)
{
WmiCloseBlock(hDataBlock);
}
else
{
printf("WMIQueryAllData returned error: %d\n", dwRet);
}
}
else
{
printf("Unable to open data block (%u)\n", dwRet);
}
if (dwRet != ERROR_SUCCESS)
{
return (dwRet);
}
// Print Each Instance
//
pWnode = (PWNODE_ALL_DATA) Buffer;
NameOffsets = (LPDWORD) OffsetToPtr( pWnode,
pWnode->OffsetInstanceNameOffsets );
for (iLoop = 0; iLoop < pWnode->InstanceCount; iLoop++)
{
printf("Instance %u: ", iLoop);
PrintCountedString( (LPTSTR) OffsetToPtr( pWnode, NameOffsets[iLoop]) );
}
// Select a specific instance
//
while (bContinue == TRUE)
{
printf("Select an instance: ");
scanf("%u", &dwInstanceNumber);
printf("\n");
if (dwInstanceNumber >= iLoop)
{
printf("Invalid selection\n\n");
WaitForUser();
printf("\n\n");
}
else
{
bContinue = FALSE;
}
}
// Check the size of the input buffer
//
lpStringLocal = (LPTSTR) OffsetToPtr( pWnode, NameOffsets[dwInstanceNumber] );
usNameSize = * ((USHORT *) lpStringLocal);
lpStringLocal = (LPTSTR) ((PBYTE)lpStringLocal + sizeof(USHORT));
if (*lpdwNameSize < (usNameSize + sizeof(TCHAR)))
{
*lpdwNameSize = usNameSize + sizeof(TCHAR);
return (ERROR_INSUFFICIENT_BUFFER);
}
// Copy the instance name over to the output parameter.
// Also, a null character needs to be added to the end of
// the string because the counted string may not contain a
// NULL character.
//
if (MyIsTextUnicode(lpStringLocal))
{
usNameSize /= 2;
}
_tcsncpy( lpInstanceName, lpStringLocal, usNameSize );
lpInstanceName += usNameSize;
_tcscpy( lpInstanceName, __T(""));
return (ERROR_SUCCESS);
} // SelectInstanceName
//+----------------------------------------------------------
//
// Function: QueryWnodeAllData
//
// Descrip: This function will query the wnode and then
// print out the wnode.
//
// Returns: VOID
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
VOID
QueryWnodeAllData(
LPGUID lpGuid
)
{
HANDLE hDataBlock;
DWORD dwRet;
PBYTE Buffer;
ULONG dwBufferSize = 4096;
PWNODE_ALL_DATA pWnode;
// Open the wnode
//
dwRet = WmiOpenBlock( lpGuid,
0,
&hDataBlock
);
if (dwRet != ERROR_SUCCESS)
{
printf("Unable to open data block (%u)\n", dwRet);
WaitForUser();
return;
}
// Allocate an initial buffer
//
Buffer = (PBYTE) malloc ( dwBufferSize );
if (Buffer != NULL)
{
// Query the data block
//
dwRet = WmiQueryAllData( hDataBlock,
&dwBufferSize,
Buffer);
if (dwRet == ERROR_INSUFFICIENT_BUFFER)
{
#ifdef DBG
printf("Initial buffer too small reallocating to %u\n", dwBufferSize);
#endif
Buffer = (PBYTE) realloc (Buffer, dwBufferSize);
if (Buffer != NULL)
{
dwRet = WmiQueryAllData( hDataBlock,
&dwBufferSize,
Buffer);
}
else
{
printf("Reallocation failed\n");
}
}
if ( dwRet == ERROR_SUCCESS )
{
pWnode = (PWNODE_ALL_DATA) Buffer;
PrintAllData(pWnode);
WmiCloseBlock(hDataBlock);
}
else
{
printf("WMIQueryAllData returned error: %d\n", dwRet);
}
}
else
{
printf("Out of Memory Error. Unable to allocate buffer of size %u\n",
dwBufferSize );
}
WmiCloseBlock( hDataBlock );
WaitForUser ();
return;
} // QueryWnodeAllData
//+----------------------------------------------------------
//
// Function: QueryWnodeSingleInstance
//
// Descrip: This function will query the wnode and then
// print out the wnode.
//
// Returns: VOID
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
VOID
QueryWnodeSingleInstance(
LPGUID lpGuid
)
{
HANDLE hDataBlock;
DWORD dwRet;
TCHAR Buffer[MAX_PATH];
DWORD dwBufferSize = MAX_PATH;
LPTSTR lpInstanceName;
PWNODE_SINGLE_INSTANCE pWnode;
// Have the user select one of the instances of a particular guid to use.
//
dwRet = SelectInstanceName( lpGuid,
Buffer,
&dwBufferSize
);
if (dwRet != ERROR_SUCCESS)
{
return;
}
lpInstanceName = (TCHAR *) malloc (dwBufferSize * sizeof(TCHAR));
if (lpInstanceName == NULL)
{
printf("Out of Memory Error\n");
WaitForUser();
return;
}
else
{
_tcscpy( lpInstanceName, Buffer );
dwBufferSize = 4096;
}
// Open the wnode
//
dwRet = WmiOpenBlock( lpGuid,
0,
&hDataBlock
);
if (dwRet != ERROR_SUCCESS)
{
printf("Unable to open data block (%u)\n", dwRet);
WaitForUser();
return;
}
// Query the data block
//
dwRet = WmiQuerySingleInstance( hDataBlock,
lpInstanceName,
&dwBufferSize,
Buffer);
if ( dwRet != ERROR_SUCCESS)
{
printf("WmiQuerySingleInstance returned error: %d\n", dwRet);
WmiCloseBlock( hDataBlock );
WaitForUser();
return;
}
pWnode = (PWNODE_SINGLE_INSTANCE) Buffer;
PrintSingleInstance(pWnode);
WaitForUser();
WmiCloseBlock(hDataBlock);
return;
}
//+----------------------------------------------------------
//
// Function: SetWnodeSingleInstance
//
// Descrip: This function will query the wnode and then
// print out the wnode.
//
// Returns: VOID
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
VOID
SetWnodeSingleInstance(
LPGUID lpGuid
)
{
DWORD dwRet;
DWORD dwVersionNumber;
DWORD dwData[MAX_DATA];
DWORD dwDataSize;
UINT iLoop;
LPTSTR lpInstanceName;
TCHAR Buffer[MAX_PATH];
DWORD dwBufferSize = MAX_PATH;
HANDLE hDataBlock;
// Get the instance to set
//
dwRet = SelectInstanceName( lpGuid,
Buffer,
&dwBufferSize
);
if (dwRet != ERROR_SUCCESS)
{
return;
}
lpInstanceName = (TCHAR *) _alloca (dwBufferSize * sizeof(TCHAR));
_tcscpy( lpInstanceName, Buffer );
dwBufferSize = 4096;
// Get the version number
//
printf("What is the version number you would like to use? ");
scanf("%u", &dwVersionNumber);
printf("\n");
// Get the size of the data to set
//
printf("How many dwords is your data? ");
scanf("%u", &dwDataSize);
printf("\n");
if (dwDataSize > MAX_DATA)
{
printf("Unable to handle large data\n");
return;
}
// Get the data
//
for (iLoop = 0; iLoop < dwDataSize; iLoop++)
{
printf("Enter DWORD %u, in hex: ", iLoop);
scanf("%x", &(dwData[iLoop]));
printf("\n");
}
printf("\n");
// Open the wnode
//
dwRet = WmiOpenBlock( lpGuid,
0,
&hDataBlock
);
if (dwRet != ERROR_SUCCESS)
{
printf("Unable to open data block (%u)\n", dwRet);
WaitForUser();
return;
}
// Set the data
//
printf("Setting Instance: %s\n", lpInstanceName);
printf("Data: ");
for (iLoop = 0; iLoop < dwDataSize; iLoop++)
{
printf("0x%x ", dwData[iLoop]);
}
printf("\n");
dwRet = WmiSetSingleInstance( hDataBlock,
lpInstanceName,
dwVersionNumber,
dwDataSize * sizeof(DWORD),
dwData );
if ( dwRet != ERROR_SUCCESS)
{
printf("WMISetSingleInstance returned error: %d\n", dwRet);
}
else
{
printf("Set Success\n\n");
}
WmiCloseBlock( hDataBlock );
WaitForUser();
}
//+----------------------------------------------------------
//
// Function: SetWnodeSingleItem
//
// Descrip: This function will query the wnode and then
// print out the wnode.
//
// Returns: VOID
//
// Notes: None
//
// History: 09/16/97 drewm Created
//-----------------------------------------------------------
VOID
SetWnodeSingleItem(
LPGUID lpGuid
)
{
DWORD dwRet;
DWORD dwVersionNumber;
DWORD dwItemNumber;
DWORD dwData;
DWORD dwDataSize;
UINT iLoop;
LPTSTR lpInstanceName;
TCHAR Buffer[MAX_PATH];
DWORD dwBufferSize = MAX_PATH;
HANDLE hDataBlock;
// Get the instance to set
//
dwRet = SelectInstanceName( lpGuid,
Buffer,
&dwBufferSize
);
if (dwRet != ERROR_SUCCESS)
{
return;
}
lpInstanceName = (TCHAR *) _alloca (dwBufferSize * sizeof(TCHAR));
_tcscpy( lpInstanceName, Buffer );
dwBufferSize = 4096;
// Get the version number
//
printf("What is the version number you would like to use? ");
scanf("%u", &dwVersionNumber);
printf("\n");
// Get the item number
//
printf("What is the item number you would like to set? ");
scanf("%u", &dwItemNumber);
printf("\n");
// Get the data
//
printf("Enter data (must be a DWORD in hex): ");
scanf("%x", &dwData);
printf("\n");
printf("\n");
// Open the wnode
//
dwRet = WmiOpenBlock( lpGuid,
0,
&hDataBlock
);
if (dwRet != ERROR_SUCCESS)
{
printf("Unable to open data block (%u)\n", dwRet);
WaitForUser();
return;
}
// Set the data
//
printf("Setting Instance: %s\n", lpInstanceName);
printf("Data: 0x%x\n\n", dwData);
dwRet = WmiSetSingleItem( hDataBlock,
lpInstanceName,
dwItemNumber,
dwVersionNumber,
sizeof(DWORD),
&dwData );
if ( dwRet != ERROR_SUCCESS)
{
printf("WMISetSingleInstance returned error: %d\n", dwRet);
}
else
{
printf("Set Success\n\n");
}
WmiCloseBlock( hDataBlock );
WaitForUser();
}