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