mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
940 lines
24 KiB
940 lines
24 KiB
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
method.c
|
|
|
|
Abstract:
|
|
|
|
acpi mapper test app
|
|
|
|
Author:
|
|
|
|
16-Jan-1997 AlanWar
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
#include <ole2.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "wmium.h"
|
|
|
|
GUID AAGuid = {0xABBC0F5A, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
GUID ABGuid = {0xABBC0F5B, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
GUID A0Guid = {0xABBC0F5C, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
|
|
GUID BAGuid = {0xABBC0F6A, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
GUID BBGuid = {0xABBC0F6B, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
GUID B0Guid = {0xABBC0F6C, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
|
|
GUID CAGuid = {0xABBC0F7A, 0x8ea1, 0x11d1, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10, 0x00, 0x00};
|
|
|
|
#define OffsetToPtr(Base, Offset) ((PBYTE)((PBYTE)Base + Offset))
|
|
|
|
ULONG InstanceCount;
|
|
PCHAR *InstanceNames;
|
|
|
|
#define InstanceName0 InstanceNames[0]
|
|
#define InstanceName1 InstanceNames[1]
|
|
#define InstanceName2 InstanceNames[2]
|
|
|
|
#define MYSTRING L"XYZZY-PLUGH-PLOVER"
|
|
WCHAR FUNNYSTRING[] = { sizeof(MYSTRING), MYSTRING };
|
|
|
|
ULONG ValueBuffer[4] = { 0x66666666, 0x77777777, 0x88888888, 0x99999999 };
|
|
|
|
|
|
ULONG DetermineInstanceNames(
|
|
LPGUID Guid,
|
|
PULONG InstanceCount,
|
|
PCHAR **InstanceNamePtrArray
|
|
)
|
|
{
|
|
ULONG j;
|
|
WMIHANDLE Handle;
|
|
ULONG status;
|
|
ULONG bufferSize;
|
|
PUCHAR buffer;
|
|
ULONG i, iCount, linkage;
|
|
PWNODE_ALL_DATA WAD;
|
|
PCHAR *iNames;
|
|
PULONG pInstanceNameOffsets;
|
|
PCHAR pName;
|
|
PUSHORT pNameSize;
|
|
|
|
status = WmiOpenBlock(Guid,
|
|
GENERIC_READ,
|
|
&Handle);
|
|
|
|
if (status != ERROR_SUCCESS)
|
|
{
|
|
printf("WmiOpenBlock(Statyus) => %d\n", status);
|
|
return(status);
|
|
}
|
|
|
|
bufferSize = 0x1000;
|
|
buffer = NULL;
|
|
status = ERROR_INSUFFICIENT_BUFFER;
|
|
|
|
while (status == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
if (buffer != NULL)
|
|
{
|
|
free(buffer);
|
|
}
|
|
|
|
buffer = malloc(bufferSize);
|
|
if (buffer == NULL)
|
|
{
|
|
status = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
|
|
status = WmiQueryAllData(Handle,
|
|
&bufferSize,
|
|
buffer);
|
|
}
|
|
|
|
if (status == ERROR_SUCCESS)
|
|
{
|
|
WAD = (PWNODE_ALL_DATA)buffer;
|
|
linkage = 0;
|
|
iCount = 0;
|
|
do
|
|
{
|
|
WAD = (PWNODE_ALL_DATA)OffsetToPtr(WAD, linkage);
|
|
linkage = WAD->WnodeHeader.Linkage;
|
|
iCount += WAD->InstanceCount;
|
|
|
|
} while (linkage != 0);
|
|
|
|
|
|
iNames = malloc(iCount * sizeof(PCHAR));
|
|
if (iNames == NULL)
|
|
{
|
|
status = ERROR_NOT_ENOUGH_MEMORY;
|
|
return(status);
|
|
}
|
|
|
|
WAD = (PWNODE_ALL_DATA)buffer;
|
|
linkage = 0;
|
|
i = 0;
|
|
do
|
|
{
|
|
WAD = (PWNODE_ALL_DATA)OffsetToPtr(WAD, linkage);
|
|
|
|
pInstanceNameOffsets = (PULONG)OffsetToPtr(WAD, WAD->OffsetInstanceNameOffsets);
|
|
for (j = 0; j < WAD->InstanceCount; j++)
|
|
{
|
|
pNameSize = (PUSHORT)OffsetToPtr(WAD, pInstanceNameOffsets[j]);
|
|
pName = (PCHAR)OffsetToPtr(pNameSize, sizeof(USHORT));
|
|
|
|
iNames[i] = malloc(*pNameSize + 1);
|
|
if (iNames[i] == NULL)
|
|
{
|
|
status = ERROR_NOT_ENOUGH_MEMORY;
|
|
return(status);
|
|
}
|
|
|
|
memset(iNames[i], 0, *pNameSize + 1);
|
|
memcpy(iNames[i], pName, *pNameSize);
|
|
i++;
|
|
}
|
|
|
|
linkage = WAD->WnodeHeader.Linkage;
|
|
|
|
} while (linkage != 0);
|
|
|
|
} else {
|
|
printf("QAD(status) -> %d\n", status);
|
|
}
|
|
|
|
free(buffer);
|
|
|
|
*InstanceCount = iCount;
|
|
*InstanceNamePtrArray = iNames;
|
|
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|
|
|
|
PCHAR GuidToString(
|
|
PCHAR s,
|
|
LPGUID piid
|
|
)
|
|
{
|
|
sprintf(s, "%x-%x-%x-%x%x%x%x%x%x%x%x",
|
|
piid->Data1, piid->Data2,
|
|
piid->Data3,
|
|
piid->Data4[0], piid->Data4[1],
|
|
piid->Data4[2], piid->Data4[3],
|
|
piid->Data4[4], piid->Data4[5],
|
|
piid->Data4[6], piid->Data4[7]);
|
|
|
|
return(s);
|
|
}
|
|
|
|
|
|
ULONG
|
|
QuerySetCheck(
|
|
LPGUID Guid,
|
|
PCHAR InstanceName,
|
|
BOOLEAN UseString,
|
|
BOOLEAN *Success
|
|
)
|
|
{
|
|
WMIHANDLE WmiHandle;
|
|
BYTE Buffer[4096];
|
|
ULONG BufferSize;
|
|
PUCHAR CheckValue, Value;
|
|
ULONG CheckSize, ValueSize;
|
|
CHAR s[MAX_PATH];
|
|
ULONG Status;
|
|
PWNODE_SINGLE_INSTANCE Wnode;
|
|
|
|
if (UseString)
|
|
{
|
|
Value = (PUCHAR)FUNNYSTRING;
|
|
ValueSize = sizeof(FUNNYSTRING);
|
|
} else {
|
|
Value = (PUCHAR)ValueBuffer;
|
|
ValueSize = sizeof(ValueBuffer);
|
|
}
|
|
|
|
Status = WmiOpenBlock(Guid, 0, &WmiHandle);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
Status = WmiSetSingleInstance(WmiHandle,
|
|
InstanceName,
|
|
0,
|
|
ValueSize,
|
|
Value);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
BufferSize = sizeof(Buffer);
|
|
Status = WmiQuerySingleInstance(WmiHandle,
|
|
InstanceName,
|
|
&BufferSize,
|
|
Buffer);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
Wnode = (PWNODE_SINGLE_INSTANCE)Buffer;
|
|
CheckValue = Buffer + Wnode->DataBlockOffset;
|
|
CheckSize = Wnode->SizeDataBlock;
|
|
|
|
*Success = ((CheckSize == ValueSize) &&
|
|
(memcmp(CheckValue, Value, ValueSize) == 0));
|
|
|
|
} else {
|
|
printf("QuerySetCheck: WmiQuerySingleInstance(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
} else {
|
|
printf("QuerySetCheck: WmiSetSingleInstance(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
WmiCloseBlock(WmiHandle);
|
|
} else {
|
|
printf("QuerySetCheck: WmiOpenBlock(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
return(Status);
|
|
}
|
|
|
|
|
|
ULONG
|
|
TrySmallQuery(
|
|
LPGUID Guid,
|
|
PCHAR InstanceName
|
|
)
|
|
{
|
|
UCHAR Buffer[4096];
|
|
ULONG BufferSize;
|
|
ULONG Status;
|
|
WMIHANDLE WmiHandle;
|
|
CHAR s[MAX_PATH];
|
|
|
|
Status = WmiOpenBlock(Guid, 0, &WmiHandle);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
BufferSize = 0;
|
|
Status = ERROR_INSUFFICIENT_BUFFER;
|
|
while (Status == ERROR_INSUFFICIENT_BUFFER)
|
|
{
|
|
printf("TrySmallQuery(%s): size %d --> ",
|
|
GuidToString(s, Guid),
|
|
BufferSize);
|
|
Status = WmiQuerySingleInstance(WmiHandle,
|
|
InstanceName,
|
|
&BufferSize,
|
|
Buffer);
|
|
printf("%d\n", Status);
|
|
|
|
}
|
|
|
|
printf("TrySmallQuery(%s): -> %d size %d\n",
|
|
GuidToString(s, Guid),
|
|
Status,
|
|
BufferSize);
|
|
} else {
|
|
printf("TrySmallQuery: WmiOpenBlock(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
return(Status);
|
|
}
|
|
|
|
|
|
typedef struct
|
|
{
|
|
HANDLE Event;
|
|
PUCHAR Value;
|
|
ULONG ValueSize;
|
|
BOOLEAN Success;
|
|
} CHECK_EVENT_CONTEXT, *PCHECK_EVENT_CONTEXT;
|
|
|
|
void NotificationRoutine(
|
|
PWNODE_HEADER Wnode,
|
|
ULONG Context
|
|
)
|
|
{
|
|
PWNODE_SINGLE_INSTANCE WnodeSi = (PWNODE_SINGLE_INSTANCE)Wnode;
|
|
PUCHAR CheckValue, Value;
|
|
ULONG CheckSize, ValueSize;
|
|
PCHECK_EVENT_CONTEXT CheckEventContext;
|
|
CHAR s[MAX_PATH];
|
|
HANDLE Handle;
|
|
ULONG Status;
|
|
|
|
Status = RpcImpersonateClient(0);
|
|
|
|
printf("RpcImpersonateClient -> %d\n", Status);
|
|
|
|
Handle = CreateFile("foo.bar",
|
|
GENERIC_READ,
|
|
0,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
|
|
if (Handle == INVALID_HANDLE_VALUE)
|
|
{
|
|
printf("Error opening locked file %d\n", GetLastError());
|
|
} else {
|
|
printf("Opened locked file\n");
|
|
CloseHandle(Handle);
|
|
}
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
RpcRevertToSelf();
|
|
}
|
|
|
|
printf("Event Received for %s\n", GuidToString(s, &Wnode->Guid));
|
|
CheckEventContext = (PCHECK_EVENT_CONTEXT)Context;
|
|
|
|
CheckSize = WnodeSi->SizeDataBlock;
|
|
CheckValue = ((PUCHAR)WnodeSi) + WnodeSi->DataBlockOffset;
|
|
|
|
ValueSize = CheckEventContext->ValueSize;
|
|
Value = CheckEventContext->Value;
|
|
|
|
if ((CheckSize != ValueSize) ||
|
|
(memcmp(CheckValue, Value, ValueSize) != 0))
|
|
{
|
|
printf("Event Data doesn't match %x %d != %x %d\n",
|
|
Value, ValueSize, CheckValue, CheckSize);
|
|
} else {
|
|
CheckEventContext->Success = TRUE;
|
|
}
|
|
|
|
SetEvent(CheckEventContext->Event);
|
|
|
|
}
|
|
|
|
ULONG
|
|
DoMethodAndCatchEvent(
|
|
LPGUID MethodGuid,
|
|
PCHAR InstanceName,
|
|
LPGUID EventGuid,
|
|
BOOLEAN UseString,
|
|
BOOLEAN EnableEvent,
|
|
PBOOLEAN MethodSuccess,
|
|
PBOOLEAN EventSuccess
|
|
)
|
|
{
|
|
UCHAR Buffer[4096];
|
|
ULONG BufferSize;
|
|
ULONG Status, Status2;
|
|
WMIHANDLE WmiHandle;
|
|
PUCHAR CheckValue, Value;
|
|
ULONG CheckSize, ValueSize;
|
|
HANDLE Event;
|
|
CHAR s[MAX_PATH];
|
|
PCHECK_EVENT_CONTEXT CheckEventContext;
|
|
PWNODE_SINGLE_INSTANCE Wnode;
|
|
|
|
CheckEventContext = (PCHECK_EVENT_CONTEXT)malloc(sizeof(CHECK_EVENT_CONTEXT));
|
|
if (CheckEventContext != NULL)
|
|
{
|
|
Event = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
CheckEventContext->Event = Event;
|
|
if (UseString)
|
|
{
|
|
Value = (PUCHAR)FUNNYSTRING;
|
|
ValueSize = sizeof(FUNNYSTRING);
|
|
} else {
|
|
Value = (PUCHAR)ValueBuffer;
|
|
ValueSize = sizeof(ValueBuffer);
|
|
}
|
|
|
|
CheckEventContext->Value = Value;
|
|
CheckEventContext->ValueSize = ValueSize;
|
|
CheckEventContext->Success = FALSE;
|
|
|
|
Status = WmiOpenBlock(MethodGuid, 0, &WmiHandle);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if (EnableEvent)
|
|
{
|
|
Status = WmiNotificationRegistration(EventGuid,
|
|
TRUE,
|
|
NotificationRoutine,
|
|
(ULONG)CheckEventContext,
|
|
NOTIFICATION_CALLBACK_DIRECT);
|
|
} else {
|
|
Status = ERROR_SUCCESS;
|
|
}
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
CheckSize = sizeof(Buffer);
|
|
Status = WmiExecuteMethod(WmiHandle,
|
|
InstanceName,
|
|
1,
|
|
ValueSize,
|
|
Value,
|
|
&CheckSize,
|
|
Buffer);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
CheckValue = (PUCHAR)Buffer;
|
|
|
|
*MethodSuccess = ((CheckSize == ValueSize) &&
|
|
(memcmp(CheckValue, Value, ValueSize) == 0));
|
|
|
|
Status2 = WaitForSingleObject(Event, 10*1000);
|
|
if (Status2 == WAIT_OBJECT_0)
|
|
{
|
|
*EventSuccess = CheckEventContext->Success;
|
|
free(CheckEventContext);
|
|
} else {
|
|
printf("Event for %s not received\n",
|
|
GuidToString(s, EventGuid));
|
|
}
|
|
} else {
|
|
printf("DoMethodAndCatchEvent: WmiExecuteMethod(%s) -> %d\n",
|
|
GuidToString(s, MethodGuid),
|
|
Status);
|
|
}
|
|
|
|
if (EnableEvent)
|
|
{
|
|
WmiNotificationRegistration(EventGuid,
|
|
FALSE,
|
|
NULL,
|
|
0,
|
|
NOTIFICATION_CALLBACK_DIRECT);
|
|
}
|
|
} else {
|
|
printf("DoMethodAndCatchEvent: WmiNotificationRegistration(%s) -> %d\n",
|
|
GuidToString(s, EventGuid),
|
|
Status);
|
|
}
|
|
WmiCloseBlock(WmiHandle);
|
|
} else {
|
|
printf("DoMethodAndCatchEvent: WmiOpenBlock(%s) -> %d\n",
|
|
GuidToString(s, MethodGuid),
|
|
Status);
|
|
|
|
}
|
|
|
|
}
|
|
return(Status);
|
|
}
|
|
|
|
|
|
void TinyQueryTest(
|
|
void
|
|
)
|
|
{
|
|
ULONG Status;
|
|
|
|
Status = TrySmallQuery(&AAGuid,
|
|
InstanceName0);
|
|
|
|
Status = TrySmallQuery(&BAGuid,
|
|
InstanceName0);
|
|
|
|
Status = TrySmallQuery(&BAGuid,
|
|
InstanceName1);
|
|
|
|
Status = TrySmallQuery(&BAGuid,
|
|
InstanceName2);
|
|
|
|
Status = TrySmallQuery(&CAGuid,
|
|
InstanceName2);
|
|
|
|
}
|
|
|
|
ULONG QuerySetStuffTest(
|
|
LPGUID Guid,
|
|
CHAR *InstanceName,
|
|
BOOLEAN UseString,
|
|
PULONG QueryStatus,
|
|
PULONG SetStatus
|
|
)
|
|
{
|
|
WMIHANDLE WmiHandle;
|
|
BYTE Buffer[4096];
|
|
ULONG BufferSize;
|
|
PUCHAR Value;
|
|
ULONG ValueSize;
|
|
CHAR s[MAX_PATH];
|
|
ULONG Status;
|
|
|
|
if (UseString)
|
|
{
|
|
Value = (PUCHAR)FUNNYSTRING;
|
|
ValueSize = sizeof(FUNNYSTRING);
|
|
} else {
|
|
Value = (PUCHAR)ValueBuffer;
|
|
ValueSize = sizeof(ValueBuffer);
|
|
}
|
|
|
|
Status = WmiOpenBlock(Guid, 0, &WmiHandle);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
*SetStatus = WmiSetSingleInstance(WmiHandle,
|
|
InstanceName,
|
|
0,
|
|
ValueSize,
|
|
Value);
|
|
|
|
|
|
BufferSize = sizeof(Buffer);
|
|
*QueryStatus = WmiQuerySingleInstance(WmiHandle,
|
|
InstanceName,
|
|
&BufferSize,
|
|
Buffer);
|
|
|
|
WmiCloseBlock(WmiHandle);
|
|
} else {
|
|
printf("QuerySetTest: WmiOpenBlock(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
return(Status);
|
|
}
|
|
|
|
ULONG SetBadStringTest(
|
|
LPGUID Guid,
|
|
CHAR *InstanceName,
|
|
ULONG BadStringLength,
|
|
PUCHAR BadString,
|
|
PULONG SetStatus
|
|
)
|
|
{
|
|
WMIHANDLE WmiHandle;
|
|
PUCHAR Value;
|
|
ULONG ValueSize;
|
|
CHAR s[MAX_PATH];
|
|
ULONG Status;
|
|
|
|
Value = (PUCHAR)BadString;
|
|
ValueSize = BadStringLength;
|
|
|
|
Status = WmiOpenBlock(Guid, 0, &WmiHandle);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
*SetStatus = WmiSetSingleInstance(WmiHandle,
|
|
InstanceName,
|
|
0,
|
|
ValueSize,
|
|
Value);
|
|
|
|
|
|
WmiCloseBlock(WmiHandle);
|
|
} else {
|
|
printf("SetBadString: WmiOpenBlock(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
return(Status);
|
|
}
|
|
|
|
ULONG ExecuteMethodTest(
|
|
LPGUID Guid,
|
|
CHAR *InstanceName,
|
|
BOOLEAN UseString,
|
|
PULONG OutBufferSize,
|
|
PUCHAR OutBuffer,
|
|
PULONG ExecuteStatus
|
|
)
|
|
{
|
|
WMIHANDLE WmiHandle;
|
|
CHAR s[MAX_PATH];
|
|
PUCHAR Value;
|
|
ULONG ValueSize;
|
|
ULONG Status;
|
|
|
|
if (UseString)
|
|
{
|
|
Value = (PUCHAR)FUNNYSTRING;
|
|
ValueSize = sizeof(FUNNYSTRING);
|
|
} else {
|
|
Value = (PUCHAR)ValueBuffer;
|
|
ValueSize = sizeof(ValueBuffer);
|
|
}
|
|
|
|
Status = WmiOpenBlock(Guid, 0, &WmiHandle);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
*ExecuteStatus = WmiExecuteMethod(WmiHandle,
|
|
InstanceName,
|
|
1,
|
|
ValueSize,
|
|
Value,
|
|
OutBufferSize,
|
|
OutBuffer);
|
|
|
|
|
|
WmiCloseBlock(WmiHandle);
|
|
} else {
|
|
printf("ExecuteMehtod: WmiOpenBlock(%s) -> %d\n",
|
|
GuidToString(s, Guid),
|
|
Status);
|
|
}
|
|
return(Status);
|
|
}
|
|
|
|
void QuerySetEventAndMethodTest(
|
|
void
|
|
)
|
|
{
|
|
ULONG Status;
|
|
ULONG QueryStatus, SetStatus;
|
|
|
|
Status = QuerySetStuffTest(&A0Guid,
|
|
InstanceName0,
|
|
FALSE,
|
|
&QueryStatus,
|
|
&SetStatus);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
printf("QuerySetStuffTest(&A0) Query -> %d, Set -> %d\n",
|
|
QueryStatus,
|
|
SetStatus);
|
|
} else {
|
|
printf("QuerySetTest: WmiOpenBlock(abbc0f5c-... is ok, not a failure\n");
|
|
}
|
|
|
|
Status = QuerySetStuffTest(&ABGuid,
|
|
InstanceName0,
|
|
TRUE,
|
|
&QueryStatus,
|
|
&SetStatus);
|
|
|
|
if (Status != ERROR_SUCCESS)
|
|
{
|
|
printf("QUerySetStuffTest(&AB) failed %d\n", Status);
|
|
}
|
|
|
|
if ((Status == ERROR_SUCCESS) &&
|
|
((QueryStatus == ERROR_SUCCESS) || (SetStatus == ERROR_SUCCESS)))
|
|
{
|
|
printf("QuerySetStuffTest(&AB) Query -> %d, Set -> %d\n",
|
|
QueryStatus,
|
|
SetStatus);
|
|
}
|
|
}
|
|
|
|
void
|
|
SetBadStringsTest(
|
|
void
|
|
)
|
|
{
|
|
UCHAR BadStringBuffer[0x100];
|
|
ULONG Status, SetStatus;
|
|
|
|
*((PWCHAR)BadStringBuffer) = 0x7890;
|
|
Status = SetBadStringTest(&AAGuid,
|
|
InstanceName0,
|
|
sizeof(BadStringBuffer),
|
|
BadStringBuffer,
|
|
&SetStatus);
|
|
if (Status != ERROR_SUCCESS)
|
|
{
|
|
printf("SetBadStringTest too long failed %d\n", Status);
|
|
}
|
|
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus == ERROR_SUCCESS))
|
|
{
|
|
printf("SetBadStringTest: too long -> %d\n", SetStatus);
|
|
}
|
|
|
|
memset(BadStringBuffer, 0xa9, sizeof(BadStringBuffer));
|
|
*((PWCHAR)BadStringBuffer) = 0x10;
|
|
Status = SetBadStringTest(&AAGuid,
|
|
InstanceName0,
|
|
sizeof(BadStringBuffer),
|
|
BadStringBuffer,
|
|
&SetStatus);
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus == ERROR_SUCCESS))
|
|
{
|
|
printf("SetBadStringTest: bad string -> %d - this is not a failure\n", SetStatus);
|
|
} else {
|
|
printf("SetBadStringTest bad string failed %d\n", Status);
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
SetEmptyTest(
|
|
void
|
|
)
|
|
{
|
|
UCHAR BadStringBuffer[0x100];
|
|
ULONG Status, SetStatus;
|
|
|
|
Status = SetBadStringTest(&AAGuid,
|
|
InstanceName0,
|
|
0,
|
|
BadStringBuffer,
|
|
&SetStatus);
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus != ERROR_SUCCESS))
|
|
{
|
|
printf("SetEmptyTest: -> %d\n", SetStatus);
|
|
}
|
|
|
|
Status = SetBadStringTest(&BAGuid,
|
|
InstanceName0,
|
|
0,
|
|
BadStringBuffer,
|
|
&SetStatus);
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus != ERROR_SUCCESS))
|
|
{
|
|
printf("SetEmptyTest(BA): -> %d\n", SetStatus);
|
|
}
|
|
|
|
// TODO: check that instances actually set to empty
|
|
}
|
|
|
|
void
|
|
ExecuteEmptyTest(
|
|
void
|
|
)
|
|
{
|
|
UCHAR OutBuffer[0x100];
|
|
ULONG Status, SetStatus;
|
|
ULONG OutSize;
|
|
|
|
Status = ExecuteMethodTest(&ABGuid,
|
|
InstanceName0,
|
|
TRUE,
|
|
&OutSize,
|
|
NULL,
|
|
&SetStatus);
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus != ERROR_SUCCESS))
|
|
{
|
|
printf("ExecuteMethodTest (void): -> %d, size = %d\n", SetStatus, OutSize);
|
|
}
|
|
|
|
OutSize = 1;
|
|
Status = ExecuteMethodTest(&ABGuid,
|
|
InstanceName0,
|
|
TRUE,
|
|
&OutSize,
|
|
OutBuffer,
|
|
&SetStatus);
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus != ERROR_INSUFFICIENT_BUFFER))
|
|
{
|
|
printf("ExecuteMethodTest (too small): -> %d, size = %d\n", SetStatus, OutSize);
|
|
}
|
|
|
|
Status = ExecuteMethodTest(&ABGuid,
|
|
InstanceName0,
|
|
TRUE,
|
|
&OutSize,
|
|
OutBuffer,
|
|
&SetStatus);
|
|
if ((Status == ERROR_SUCCESS) && (SetStatus != ERROR_SUCCESS))
|
|
{
|
|
printf("ExecuteMethodTest (right size): -> %d, size = %d\n", SetStatus, OutSize);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void
|
|
QuerySetTest(
|
|
void
|
|
)
|
|
{
|
|
ULONG Status;
|
|
BOOLEAN Success;
|
|
|
|
Status = QuerySetCheck(&AAGuid,
|
|
InstanceName0,
|
|
TRUE,
|
|
&Success);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if ( ! Success)
|
|
{
|
|
printf("QuerySetTest AAGuid Data didn't match\n");
|
|
}
|
|
}
|
|
|
|
Status = QuerySetCheck(&BAGuid,
|
|
InstanceName0,
|
|
FALSE,
|
|
&Success);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if ( ! Success)
|
|
{
|
|
printf("QuerySetTest BAGuid 0 Data didn't match\n");
|
|
}
|
|
}
|
|
|
|
Status = QuerySetCheck(&BAGuid,
|
|
InstanceName1,
|
|
FALSE,
|
|
&Success);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if ( ! Success)
|
|
{
|
|
printf("QuerySetTest BAGuid 1 Data didn't match\n");
|
|
}
|
|
}
|
|
|
|
Status = QuerySetCheck(&BAGuid,
|
|
InstanceName2,
|
|
FALSE,
|
|
&Success);
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if ( ! Success)
|
|
{
|
|
printf("QuerySetTest BAGuid 2 Data didn't match\n");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
FireEventTest(
|
|
void
|
|
)
|
|
{
|
|
ULONG Status;
|
|
BOOLEAN MethodSuccess, EventSuccess;
|
|
|
|
Status = DoMethodAndCatchEvent(&ABGuid,
|
|
InstanceName0,
|
|
&A0Guid,
|
|
TRUE,
|
|
TRUE,
|
|
&MethodSuccess,
|
|
&EventSuccess);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if (! MethodSuccess)
|
|
{
|
|
printf("FireEventTest AAGuid Method Data didn't match\n");
|
|
}
|
|
|
|
if (! EventSuccess)
|
|
{
|
|
printf("FireEventTest AAGuid Event Data didn't match\n");
|
|
}
|
|
}
|
|
|
|
Status = DoMethodAndCatchEvent(&BBGuid,
|
|
InstanceName0,
|
|
&B0Guid,
|
|
FALSE,
|
|
TRUE,
|
|
&MethodSuccess,
|
|
&EventSuccess);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
if (! MethodSuccess)
|
|
{
|
|
printf("FireEventTest BBGuid Method Data didn't match\n");
|
|
}
|
|
|
|
if (! EventSuccess)
|
|
{
|
|
printf("FireEventTest BBGuid Event Data didn't match\n");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
int _cdecl main(int argc, char *argv[])
|
|
{
|
|
|
|
ULONG Status;
|
|
|
|
|
|
Status = DetermineInstanceNames(&BAGuid,
|
|
&InstanceCount,
|
|
&InstanceNames);
|
|
|
|
if (Status != ERROR_SUCCESS)
|
|
{
|
|
printf("DetermineInstanceNames failed %d\n", Status);
|
|
return(Status);
|
|
}
|
|
|
|
#if 1
|
|
//
|
|
// Expected successful completion tests
|
|
TinyQueryTest();
|
|
QuerySetTest();
|
|
FireEventTest();
|
|
|
|
//
|
|
// Error condition tests
|
|
QuerySetEventAndMethodTest();
|
|
SetBadStringsTest();
|
|
SetEmptyTest();
|
|
ExecuteEmptyTest();
|
|
#endif
|
|
|
|
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|