934 lines
21 KiB
C
934 lines
21 KiB
C
/************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();
|
||
|
||
}
|
||
|
||
|