Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

1499 lines
42 KiB

/*++
Copyright (c) 1997-1999 Microsoft Corporation
Module Name:
dc1.c
Abstract:
data consumer test
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>
#define MEMPHIS
#include "wmium.h"
#include "wmiumkm.h"
#define OffsetToPtr(Base, Offset) ((PBYTE)((PBYTE)Base + Offset))
typedef struct tagTESTGUID TESTGUID;
GUID BotDynGuid = {0xce5b1020,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
GUID TopDynGuid = {0xce5b1023,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
GUID RSIGuid = {0xce5b1023,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
GUID RSBGuid = {0xce5b1024,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
// both
GUID SIGuid = {0xce5b1021,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
GUID SBGuid = {0xce5b1022,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
GUID UnRegGuid = {0xce5b1025,0x8ea9,0x11d0,0xa4, 0xec, 0x00, 0xa0, 0xc9,0x06,0x29,0x10};
GUID GuidNull =
{ 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 } };
ULONG BufferSize = 4096;
BYTE Buffer[4096];
void EventCallbackRoutine0(PWNODE_HEADER WnodeHeader, ULONG Context);
void EventCallbackRoutine1(PWNODE_HEADER WnodeHeader, ULONG Context);
void EventCallbackRoutine2(PWNODE_HEADER WnodeHeader, ULONG Context);
void EventCallbackRoutine3(PWNODE_HEADER WnodeHeader, ULONG Context);
void EventCallbackRoutine4(PWNODE_HEADER WnodeHeader, ULONG Context);
typedef BOOLEAN (*QADVALIDATION)(
TESTGUID *TestGuid,
PVOID Buffer,
ULONG BufferSize
);
typedef ULONG (*QSINSET)(
TESTGUID *TestGuid,
PULONG *DataList,
PULONG DataListSize,
PBYTE *ValueBuffer,
ULONG *ValueBufferSize,
ULONG Instance
);
typedef ULONG (*QSITSET)(
TESTGUID *TestGuid,
PULONG *DataList,
PULONG DataListSize,
PBYTE *ValueBuffer,
ULONG *ValueBufferSize,
ULONG Instance,
ULONG ItemId
);
typedef BOOLEAN (*QSINTVALIDATION)(
TESTGUID *TestGuid,
PULONG *DataList,
PULONG DataListSize,
PVOID Buffer,
ULONG BufferSize,
ULONG Instance
);
typedef PWCHAR (*GETINSTANCENAME)(
TESTGUID *TestGuid,
ULONG Instance
);
typedef struct tagTESTGUID
{
LPGUID Guid;
HANDLE Handle;
PULONG DataListSize;
PULONG *InitDataList;
PULONG *SINDataList;
PULONG *SITDataList;
PWCHAR *InstanceNames;
QADVALIDATION QADValidation;
ULONG QADFlags;
ULONG InstanceCount;
GETINSTANCENAME GetInstanceName;
ULONG QSINTFlags;
QSINTVALIDATION QSINTValidation;
QSINSET QSINSet;
ULONG ItemCount;
QSITSET QSITSet;
ULONG EventsSent;
ULONG EventsReceived;
NOTIFICATIONCALLBACK NotificationCallback;
} TESTGUID;
//
// Common validation/set routines
ULONG QSINSet(
TESTGUID *TestGuid,
PULONG *DataList,
PULONG DataListSize,
PBYTE *ValueBuffer,
ULONG *ValueBufferSize,
ULONG Instance
)
{
*ValueBuffer = (PBYTE)DataList[Instance];
*ValueBufferSize = DataListSize[Instance];
return(ERROR_SUCCESS);
}
BOOLEAN QSINTValidate(
TESTGUID *TestGuid,
PULONG *DataList,
PULONG DataListSize,
PVOID Buffer,
ULONG BufferSize,
ULONG Instance
)
{
PWNODE_SINGLE_INSTANCE Wnode = Buffer;
PULONG Data;
PULONG NameOffsets;
PWCHAR Name;
ULONG NameLen;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, TestGuid->Guid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != TestGuid->QSINTFlags) ||
(Wnode->SizeDataBlock != DataListSize[Instance]))
{
return(FALSE);
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
if (memcmp(Data, DataList[Instance], DataListSize[Instance]) != 0)
{
return(FALSE);
}
Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
NameLen = wcslen(TestGuid->InstanceNames[Instance]) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, TestGuid->InstanceNames[Instance], NameLen) != 0))
{
return(FALSE);
}
return(TRUE);
}
ULONG QSITSet(
TESTGUID *TestGuid,
PULONG *DataList,
PULONG DataListSize,
PBYTE *ValueBuffer,
ULONG *ValueBufferSize,
ULONG Instance,
ULONG ItemId
)
{
*ValueBuffer = (PBYTE)(DataList[Instance] + ItemId);
*ValueBufferSize = sizeof(ULONG);
return(ERROR_SUCCESS);
}
PWCHAR GetInstanceName(
TESTGUID *TestGuid,
ULONG Instance
)
{
return(TestGuid->InstanceNames[Instance]);
}
//
// Guid 20
ULONG Values20Init_1[4] = { 1,2,3,4};
ULONG Values20Init_2[4] = { 5,6,7,8};
PULONG Values20Init_List[4] =
{
Values20Init_1,
Values20Init_2,
Values20Init_1,
Values20Init_2
};
ULONG Values20_Size[4] = { 0x10,0x10,0x10,0x10 };
ULONG Values20_1[4] = { 0x11111111,0x22222222,0x33333333,0x44444444};
ULONG Values20_2[4] = { 0x55555555,0x66666666,0x77777777,0x88888888};
ULONG Values20_3[4] = { 0x12345678,0x23456789,0x3456789A,0x456789AB};
ULONG Values20_4[4] = { 0x56789ABC,0x6789ABCD,0x789ABCDE,0x89ABCDEF};
PULONG Values20_List[4] =
{
Values20_1,
Values20_2,
Values20_3,
Values20_4
};
ULONG Values20T_1[4] = { 0x1000,0x2000,0x3000,0x4000};
ULONG Values20T_2[4] = { 0x50000000,0x60000000,0x70000000,0x80000000};
ULONG Values20T_3[4] = { 0x90000000,0xA0000000,0xB0000000,0xC0000000};
ULONG Values20T_4[4] = { 0x0000D000,0x0000E000,0x0000F000,0x00000000};
PULONG Values20T_List[4] =
{
Values20_1,
Values20_2,
Values20_3,
Values20_4
};
PWCHAR InstanceName20[4] =
{
L"InstanceX",
L"InstanceY",
L"InstanceA",
L"InstanceB"
};
BOOLEAN QADValidate20(
TESTGUID *TestGuid,
PVOID Buffer,
ULONG BufferSize
)
{
PWNODE_ALL_DATA Wnode = Buffer;
PULONG Data;
PULONG NameOffsets;
PWCHAR Name;
ULONG NameLen;
ULONG i;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, TestGuid->Guid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != TestGuid->QADFlags) ||
(Wnode->InstanceCount != 2) ||
(Wnode->FixedInstanceSize != 0x10))
{
return(FALSE);
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
for (i = 0; i < 2; i++)
{
if (memcmp(Data, TestGuid->InitDataList[i], TestGuid->DataListSize[i]) != 0)
{
return(FALSE);
}
Data += 4;
}
NameOffsets = (ULONG *)OffsetToPtr(Wnode, Wnode->OffsetInstanceNameOffsets);
for (i = 0; i < 2; i++)
{
Name = (PWCHAR)OffsetToPtr(Wnode, *NameOffsets++);
NameLen = wcslen(TestGuid->InstanceNames[i]) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
((memcmp(++Name, TestGuid->InstanceNames[i], NameLen) != 0) &&
(memcmp(Name, TestGuid->InstanceNames[i+2], NameLen) != 0)))
{
return(FALSE);
}
}
//
// Get second wnode in chain
if (Wnode->WnodeHeader.Linkage == 0)
{
return(FALSE);
}
Wnode = (PWNODE_ALL_DATA)OffsetToPtr(Wnode, Wnode->WnodeHeader.Linkage);
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, TestGuid->Guid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != TestGuid->QADFlags) ||
(Wnode->InstanceCount != 2) ||
(Wnode->FixedInstanceSize != 0x10))
{
return(FALSE);
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
for (i = 2; i < 4; i++)
{
if (memcmp(Data, TestGuid->InitDataList[i], TestGuid->DataListSize[i]) != 0)
{
return(FALSE);
}
Data += 4;
}
NameOffsets = (ULONG *)OffsetToPtr(Wnode, Wnode->OffsetInstanceNameOffsets);
for (i = 2; i < 4; i++)
{
Name = (PWCHAR)OffsetToPtr(Wnode, *NameOffsets++);
NameLen = wcslen(TestGuid->InstanceNames[i]) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
((memcmp(++Name, TestGuid->InstanceNames[i], NameLen) != 0) &&
(memcmp(Name, TestGuid->InstanceNames[i-2], NameLen) != 0)))
{
return(FALSE);
}
}
if (Wnode->WnodeHeader.Linkage != 0)
{
return(FALSE);
}
return(TRUE);
}
//
// Guid 21
PWCHAR InstanceName21[4] =
{
L"InstanceX",
L"InstanceY",
L"InstanceA",
L"InstanceB"
};
//
// Guid 22
PWCHAR InstanceName22[4] =
{
L"Instance2",
L"Instance3",
L"Instance0",
L"Instance1"
};
//
// Guid 23
PWCHAR InstanceName23[4] =
{
L"InstanceA",
L"InstanceB"
};
BOOLEAN QADValidate23(
TESTGUID *TestGuid,
PVOID Buffer,
ULONG BufferSize
)
{
PWNODE_ALL_DATA Wnode = Buffer;
PULONG Data;
PULONG NameOffsets;
PWCHAR Name;
ULONG NameLen;
ULONG i;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, TestGuid->Guid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != TestGuid->QADFlags) ||
(Wnode->InstanceCount != 2) ||
(Wnode->FixedInstanceSize != 0x10))
{
return(FALSE);
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
for (i = 0; i < 2; i++)
{
if (memcmp(Data, TestGuid->InitDataList[i], TestGuid->DataListSize[i]) != 0)
{
return(FALSE);
}
Data += 4;
}
NameOffsets = (ULONG *)OffsetToPtr(Wnode, Wnode->OffsetInstanceNameOffsets);
for (i = 0; i < 2; i++)
{
Name = (PWCHAR)OffsetToPtr(Wnode, *NameOffsets++);
NameLen = wcslen(TestGuid->InstanceNames[i]) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, TestGuid->InstanceNames[i], NameLen) != 0))
{
return(FALSE);
}
}
if (Wnode->WnodeHeader.Linkage != 0)
{
return(FALSE);
}
return(TRUE);
}
//
// Guid 24
PWCHAR InstanceName24[4] =
{
L"Instance0",
L"Instance1"
};
#define TestCount 5
TESTGUID TestList[TestCount] = {
{
&BotDynGuid,
0,
Values20_Size,
Values20Init_List,
Values20_List,
Values20T_List,
InstanceName20,
QADValidate20,
(WNODE_FLAG_ALL_DATA | WNODE_FLAG_FIXED_INSTANCE_SIZE),
4,
GetInstanceName,
WNODE_FLAG_SINGLE_INSTANCE,
QSINTValidate,
QSINSet,
4,
QSITSet,
0,
0,
EventCallbackRoutine0
},
{
&SIGuid,
0,
Values20_Size,
Values20Init_List,
Values20_List,
Values20T_List,
InstanceName21,
QADValidate20,
(WNODE_FLAG_ALL_DATA | WNODE_FLAG_FIXED_INSTANCE_SIZE | WNODE_FLAG_STATIC_INSTANCE_NAMES),
4,
GetInstanceName,
WNODE_FLAG_SINGLE_INSTANCE | WNODE_FLAG_STATIC_INSTANCE_NAMES,
QSINTValidate,
QSINSet,
4,
QSITSet,
0,
0,
EventCallbackRoutine1
},
{
&SBGuid,
0,
Values20_Size,
Values20Init_List,
Values20_List,
Values20T_List,
InstanceName22,
QADValidate20,
(WNODE_FLAG_ALL_DATA | WNODE_FLAG_FIXED_INSTANCE_SIZE | WNODE_FLAG_STATIC_INSTANCE_NAMES),
4,
GetInstanceName,
WNODE_FLAG_SINGLE_INSTANCE | WNODE_FLAG_STATIC_INSTANCE_NAMES,
QSINTValidate,
QSINSet,
4,
QSITSet,
0,
0,
EventCallbackRoutine2
},
{
&RSIGuid,
0,
Values20_Size,
Values20Init_List,
Values20_List,
Values20T_List,
InstanceName23,
QADValidate23,
(WNODE_FLAG_ALL_DATA | WNODE_FLAG_FIXED_INSTANCE_SIZE | WNODE_FLAG_STATIC_INSTANCE_NAMES),
2,
GetInstanceName,
WNODE_FLAG_SINGLE_INSTANCE | WNODE_FLAG_STATIC_INSTANCE_NAMES,
QSINTValidate,
QSINSet,
4,
QSITSet,
0,
0,
EventCallbackRoutine3
},
{
&RSBGuid,
0,
Values20_Size,
Values20Init_List,
Values20_List,
Values20T_List,
InstanceName24,
QADValidate23,
(WNODE_FLAG_ALL_DATA | WNODE_FLAG_FIXED_INSTANCE_SIZE | WNODE_FLAG_STATIC_INSTANCE_NAMES),
2,
GetInstanceName,
WNODE_FLAG_SINGLE_INSTANCE | WNODE_FLAG_STATIC_INSTANCE_NAMES,
QSINTValidate,
QSINSet,
4,
QSITSet,
0,
0,
EventCallbackRoutine4
},
};
ULONG QADTest(
ULONG FirstTestNumber,
ULONG LastTestNumber
)
{
ULONG i;
ULONG Status;
for (i = FirstTestNumber; i < LastTestNumber; i++)
{
Status = WMIOpenBlock(NULL,
TestList[i].Guid,
&TestList[i].Handle);
if (Status != ERROR_SUCCESS)
{
printf("Error: QADTest: Couldn't open Handle %d %x\n", i, Status);
TestList[i].Handle = (HANDLE)NULL;
}
}
for (i = FirstTestNumber; i < LastTestNumber;i++)
{
if (TestList[i].Handle != (HANDLE)NULL)
{
BufferSize = sizeof(Buffer);
Status = WMIQueryAllData(TestList[i].Handle,
&BufferSize,
Buffer);
if (Status == ERROR_SUCCESS)
{
if (! (*TestList[i].QADValidation)(&TestList[i], Buffer, BufferSize))
{
printf("ERROR: QADValidation %d failed\n", i);
}
} else {
printf("Error TestList WMIQueryAllData %d failed %x\n", i, Status);
}
}
}
for (i = FirstTestNumber; i < LastTestNumber;i++)
{
if (TestList[i].Handle != (HANDLE)NULL)
{
WMICloseBlock(TestList[i].Handle);
}
}
return(ERROR_SUCCESS);
}
ULONG QSINTest(
ULONG FirstTestNumber,
ULONG LastTestNumber
)
{
ULONG i,j;
ULONG Status;
ULONG InstanceCount;
PWCHAR InstanceName;
PBYTE ValueBuffer;
ULONG ValueBufferSize;
for (i = FirstTestNumber; i < LastTestNumber; i++)
{
Status = WMIOpenBlock(NULL,
TestList[i].Guid,
&TestList[i].Handle);
if (Status != ERROR_SUCCESS)
{
printf("Error: QSINTest: Couldn't open Handle %d %x\n", i, Status);
TestList[i].Handle = (HANDLE)NULL;
}
InstanceCount = TestList[i].InstanceCount;
for (j = 0; j < InstanceCount; j++)
{
InstanceName = ((*TestList[i].GetInstanceName)(&TestList[i], j));
//
// Initial value check
BufferSize = sizeof(Buffer);
Status = WMIQuerySingleInstance(TestList[i].Handle,
InstanceName,
&BufferSize,
Buffer);
if (Status == ERROR_SUCCESS)
{
if (! (*TestList[i].QSINTValidation)(&TestList[i],
TestList[i].InitDataList,
TestList[i].DataListSize,
Buffer, BufferSize, j))
{
printf("ERROR: QSINTest Init %d/%d Validation failed %x\n", i,j,Status);
}
} else {
printf("Error QSINTest WMIQuerySingleInstance %d/%d failed %x\n", i, j, Status);
}
//
// Set new values
(*TestList[i].QSINSet)(&TestList[i],
TestList[i].SINDataList,
TestList[i].DataListSize,
&ValueBuffer, &ValueBufferSize, j);
Status = WMISetSingleInstance(TestList[i].Handle,
InstanceName,
1,
ValueBufferSize,
ValueBuffer);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: QSINTest WMISetSingleInstance %d/%d failed %x\n", i,j,Status);
}
//
// Check new values set properly
BufferSize = sizeof(Buffer);
Status = WMIQuerySingleInstance(TestList[i].Handle,
InstanceName,
&BufferSize,
Buffer);
if (Status == ERROR_SUCCESS)
{
if (!(*TestList[i].QSINTValidation)(&TestList[i],
TestList[i].SINDataList,
TestList[i].DataListSize,
Buffer, BufferSize, j))
{
printf("ERROR: QSINTTest %d/%d Validation # 2 failed %x\n", i,j,Status);
}
} else {
printf("ERROR: QSINTest: WMIQuerySingleInstance %d/%d failed %x\n", i,j,Status);
}
//
// Reset to initial values
(*TestList[i].QSINSet)(&TestList[i],
TestList[i].InitDataList,
TestList[i].DataListSize,
&ValueBuffer, &ValueBufferSize, j);
Status = WMISetSingleInstance(TestList[i].Handle,
InstanceName,
1,
ValueBufferSize,
ValueBuffer);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: QSINTTest WMISetSingleInstance Init %d/%d failed %x\n", i,j,Status);
}
//
// Check reset to initial values
BufferSize = sizeof(Buffer);
Status = WMIQuerySingleInstance(TestList[i].Handle,
InstanceName,
&BufferSize,
Buffer);
if (Status == ERROR_SUCCESS)
{
if (!(*TestList[i].QSINTValidation)(&TestList[i],
TestList[i].InitDataList,
TestList[i].DataListSize,
Buffer, BufferSize, j))
{
printf("ERROR: QSINT %d/%d Validation #2 failed %x\n", i,j,Status);
}
} else {
printf("ERROR: WMIQuerySingleInstance # 2 %d/%d failed %x\n", i,j,Status);
}
}
}
for (i = FirstTestNumber; i < LastTestNumber;i++)
{
if (TestList[i].Handle != (HANDLE)NULL)
{
WMICloseBlock(TestList[i].Handle);
}
}
return(ERROR_SUCCESS);
}
ULONG QSITTest(
ULONG FirstTestNumber,
ULONG LastTestNumber
)
{
ULONG i,j,k;
ULONG Status;
ULONG InstanceCount;
PWCHAR InstanceName;
ULONG ItemCount;
PBYTE ValueBuffer;
ULONG ValueBufferSize;
for (i = FirstTestNumber; i < LastTestNumber; i++)
{
Status = WMIOpenBlock(NULL,
TestList[i].Guid,
&TestList[i].Handle);
if (Status != ERROR_SUCCESS)
{
printf("Error: QSITTest: Couldn't open Handle %d %x\n", i, Status);
TestList[i].Handle = (HANDLE)NULL;
}
InstanceCount = TestList[i].InstanceCount;
for (j = 0; j < InstanceCount; j++)
{
InstanceName = (*TestList[i].GetInstanceName)(&TestList[i],j);
//
// Set new values
ItemCount = TestList[i].ItemCount;
for (k = 0; k < ItemCount; k++)
{
(*TestList[i].QSITSet)(&TestList[i],
TestList[i].SITDataList,
TestList[i].DataListSize,
&ValueBuffer, &ValueBufferSize, j,k);
Status = WMISetSingleItem(TestList[i].Handle,
InstanceName,
k,
1,
ValueBufferSize,
ValueBuffer);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: QSIT WMISetSingleItem %d/%d/%d failed %x\n", i,j,k,Status);
}
}
//
// Check new values set properly
BufferSize = sizeof(Buffer);
Status = WMIQuerySingleInstance(TestList[i].Handle,
InstanceName,
&BufferSize,
Buffer);
if (Status == ERROR_SUCCESS)
{
if (!(*TestList[i].QSINTValidation)(&TestList[i],
TestList[i].SITDataList,
TestList[i].DataListSize,
Buffer, BufferSize, j))
{
printf("ERROR: QSIT %d/%d Validation failed %x\n", i,j,Status);
}
} else {
printf("ERROR: QSIT %d/%d QMIQuerySingleInstance failed %x\n", i,j,Status);
}
//
// Reset to initial values
(*TestList[i].QSINSet)(&TestList[i],
TestList[i].InitDataList,
TestList[i].DataListSize,
&ValueBuffer, &ValueBufferSize, j);
Status = WMISetSingleInstance(TestList[i].Handle,
InstanceName,
1,
ValueBufferSize,
ValueBuffer);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: QSIT WMISetSingleInstance %d/%d failed %x\n", i,j,Status);
}
//
// Check reset to initial values
BufferSize = sizeof(Buffer);
Status = WMIQuerySingleInstance(TestList[i].Handle,
InstanceName,
&BufferSize,
Buffer);
if (Status == ERROR_SUCCESS)
{
if (!(*TestList[i].QSINTValidation)(&TestList[i],
TestList[i].InitDataList,
TestList[i].DataListSize,
Buffer, BufferSize, j))
{
printf("ERROR: QSIT %d/%d Validation # 2 failed %x\n", i,j,Status);
}
} else {
printf("ERROR: QSIT WMISetSingleInstance # 2 %d/%d failed %x\n", i,j,Status);
}
}
}
for (i = FirstTestNumber; i < LastTestNumber;i++)
{
if (TestList[i].Handle != (HANDLE)NULL)
{
WMICloseBlock(TestList[i].Handle);
}
}
return(ERROR_SUCCESS);
}
#define EventDeviceName TEXT("\\\\.\\STBTest")
#define EventInstanceName L"InstanceA"
ULONG EventsReceived, EventsSent;
ULONG GlobalEventsReceived, GlobalEventsSent;
void GlobalEventCallbackRoutine(PWNODE_HEADER WnodeHeader, ULONG Context)
{
PULONG Data;
PWNODE_SINGLE_INSTANCE Wnode = (PWNODE_SINGLE_INSTANCE)WnodeHeader;
PWCHAR Name;
ULONG NameLen;
GlobalEventsReceived++;
if (Context != 0x12345678)
{
printf("Event validate failed - context\n");
}
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(Wnode->WnodeHeader.Flags != (WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_SINGLE_INSTANCE)) ||
(Wnode->SizeDataBlock != 4))
{
printf("Global Event validation failed #1\n");
return;
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
// if (Data[0] != Wnode->WnodeHeader.Linkage)
// {
// printf("Global Event validation failed #2\n");
// return;
// }
Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
NameLen = wcslen(EventInstanceName) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, EventInstanceName, NameLen) != 0))
{
printf("Global Event validation failed #3\n");
}
}
void EventCallbackRoutine0(PWNODE_HEADER WnodeHeader, ULONG Context)
{
PULONG Data;
PWNODE_SINGLE_INSTANCE Wnode = (PWNODE_SINGLE_INSTANCE)WnodeHeader;
PWCHAR Name;
ULONG NameLen;
if (Context != 0xABCDEF01)
{
printf("Event validate failed - context\n");
}
TestList[0].EventsReceived++;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, &BotDynGuid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != (WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_SINGLE_INSTANCE)) ||
(Wnode->SizeDataBlock != 4))
{
printf("Event validation failed #1\n");
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
// if (Data[0] != Wnode->WnodeHeader.Linkage)
// {
// printf("Event validation failed #2\n");
// }
// Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
// NameLen = wcslen(EventInstanceName) * sizeof(WCHAR);
//
// if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
// (memcmp(++Name, EventInstanceName, NameLen) != 0))
// {
// printf("Event validation failed #3\n");
// }
}
void EventCallbackRoutine1(PWNODE_HEADER WnodeHeader, ULONG Context)
{
PULONG Data;
PWNODE_SINGLE_INSTANCE Wnode = (PWNODE_SINGLE_INSTANCE)WnodeHeader;
PWCHAR Name;
ULONG NameLen;
if (Context != 0xABCDEF01)
{
printf("Event validate failed - context\n");
}
TestList[1].EventsReceived++;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, &SIGuid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != (WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_SINGLE_INSTANCE)) ||
(Wnode->SizeDataBlock != 4))
{
printf("Event validation failed #1\n");
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
// if (Data[0] != Wnode->WnodeHeader.Linkage)
// {
// printf("Event validation failed #2\n");
// }
Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
NameLen = wcslen(EventInstanceName) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, EventInstanceName, NameLen) != 0))
{
printf("Event validation failed #3\n");
}
}
void EventCallbackRoutine2(PWNODE_HEADER WnodeHeader, ULONG Context)
{
PULONG Data;
PWNODE_SINGLE_INSTANCE Wnode = (PWNODE_SINGLE_INSTANCE)WnodeHeader;
PWCHAR Name;
ULONG NameLen;
if (Context != 0xABCDEF01)
{
printf("Event validate failed - context\n");
}
TestList[2].EventsReceived++;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, &SBGuid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != (WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_SINGLE_INSTANCE)) ||
(Wnode->SizeDataBlock != 4))
{
printf("Event validation failed #1\n");
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
// if (Data[0] != Wnode->WnodeHeader.Linkage)
// {
// printf("Event validation failed #2\n");
// }
Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
NameLen = wcslen(EventInstanceName) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, EventInstanceName, NameLen) != 0))
{
printf("Event validation failed #3\n");
}
}
void EventCallbackRoutine3(PWNODE_HEADER WnodeHeader, ULONG Context)
{
PULONG Data;
PWNODE_SINGLE_INSTANCE Wnode = (PWNODE_SINGLE_INSTANCE)WnodeHeader;
PWCHAR Name;
ULONG NameLen;
if (Context != 0xABCDEF01)
{
printf("Event validate failed - context\n");
}
TestList[3].EventsReceived++;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, &RSIGuid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != (WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_SINGLE_INSTANCE)) ||
(Wnode->SizeDataBlock != 4))
{
printf("Event validation failed #1\n");
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
// if (Data[0] != Wnode->WnodeHeader.Linkage)
// {
// printf("Event validation failed #2\n");
// }
Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
NameLen = wcslen(EventInstanceName) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, EventInstanceName, NameLen) != 0))
{
printf("Event validation failed #3\n");
}
}
void EventCallbackRoutine4(PWNODE_HEADER WnodeHeader, ULONG Context)
{
PULONG Data;
PWNODE_SINGLE_INSTANCE Wnode = (PWNODE_SINGLE_INSTANCE)WnodeHeader;
PWCHAR Name;
ULONG NameLen;
if (Context != 0xABCDEF01)
{
printf("Event validate failed - context\n");
}
TestList[4].EventsReceived++;
if ((Wnode->WnodeHeader.BufferSize == 0) ||
(Wnode->WnodeHeader.ProviderId == 0) ||
(Wnode->WnodeHeader.Version != 1) ||
#ifndef MEMPHIS
(Wnode->WnodeHeader.TimeStamp.HighPart == 0) ||
(Wnode->WnodeHeader.TimeStamp.LowPart == 0) ||
#endif
(memcmp(&Wnode->WnodeHeader.Guid, &RSBGuid, sizeof(GUID)) != 0) ||
(Wnode->WnodeHeader.Flags != (WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_SINGLE_INSTANCE)) ||
(Wnode->SizeDataBlock != 4))
{
printf("Event validation failed #1\n");
}
Data = (ULONG *)OffsetToPtr(Wnode, Wnode->DataBlockOffset);
// if (Data[0] != Wnode->WnodeHeader.Linkage)
// {
// printf("Event validation failed #2\n");
// }
Name = (PWCHAR)OffsetToPtr(Wnode, Wnode->OffsetInstanceName);
NameLen = wcslen(EventInstanceName) * sizeof(WCHAR);
if (((*Name != NameLen) && (*Name != NameLen+sizeof(WCHAR))) ||
(memcmp(++Name, EventInstanceName, NameLen) != 0))
{
printf("Event validation failed #3\n");
}
}
void EventTest(
ULONG Unused1,
ULONG Unused2
)
{
HANDLE STBHandle;
BOOLEAN f;
ULONG retsize;
ULONG Status;
ULONG WnodeEventSize;
PWNODE_SINGLE_INSTANCE Wnode;
PWCHAR InstanceNamePtr;
PULONG DataPtr;
ULONG i,j;
ULONG Size;
HANDLE DataBlockHandle;
Status = WMIOpenBlock(NULL,
&SIGuid,
&DataBlockHandle);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: Couldn't open data block %x\n", Status);
return;
}
Size = sizeof(WNODE_SINGLE_INSTANCE) +
sizeof(EventInstanceName) + sizeof(WCHAR) +
1 * sizeof(ULONG);
Wnode = malloc(Size);
if (Wnode == NULL)
{
printf("ERROR: couldn't alloc mem for event\n");
return;
}
STBHandle = CreateFile(
EventDeviceName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (STBHandle == (HANDLE)-1)
{
printf("ERROR - couldn't open Event device file %x\n",
GetLastError());
free(Wnode);
return;
}
Status = WMINotificationRegistration(&GuidNull,
TRUE,
GlobalEventCallbackRoutine,
0x12345678,
NULL,
0,
0);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: WMINotificationRegistration Global Enable failed %x\n", Status);
}
for (j = 0; j < TestCount; j++)
{
Status = WMINotificationRegistration(TestList[j].Guid,
TRUE,
TestList[j].NotificationCallback,
0xABCDEF01,
NULL,
0,
0);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: WMINotificationRegistration Enable %d failed %x\n", j, Status);
free(Wnode);
goto done;
}
}
Wnode->WnodeHeader.BufferSize = Size;
Wnode->WnodeHeader.TimeStamp.LowPart = 1;
Wnode->WnodeHeader.TimeStamp.HighPart = 1;
Wnode->WnodeHeader.Flags = WNODE_FLAG_SINGLE_INSTANCE | WNODE_FLAG_EVENT_ITEM | WNODE_FLAG_STATIC_INSTANCE_NAMES;
Wnode->WnodeHeader.Version = 1;
// InstanceNamePtr = (PWCHAR)(&Wnode->VariableData);
// *InstanceNamePtr = sizeof(EventInstanceName);
// wcscpy(InstanceNamePtr + 1, EventInstanceName);
// DataPtr = (ULONG *)((PBYTE)InstanceNamePtr + sizeof(EventInstanceName) + sizeof(WCHAR));
// Wnode->OffsetInstanceName = (ULONG)((ULONG)InstanceNamePtr - (ULONG)Wnode);
DataPtr = (ULONG *)&Wnode->VariableData;
Wnode->SizeDataBlock = 4;
Wnode->DataBlockOffset = (ULONG)((ULONG)DataPtr - (ULONG)Wnode );
EventsSent = 0;
EventsReceived = 0;
GlobalEventsSent = 0;
GlobalEventsReceived = 0;
for (i = 0; i < 25; i++)
{
DataPtr[0] = i;
for (j = 0; j < TestCount; j++)
{
memcpy(&Wnode->WnodeHeader.Guid, TestList[j].Guid, sizeof(GUID));
Wnode->InstanceIndex = i % 5;
f = DeviceIoControl( STBHandle,
IOCTL_WMI_GENERATE_EVENT,
Wnode,
Wnode->WnodeHeader.BufferSize,
NULL,
0,
&retsize,
NULL);
if (! f)
{
printf("ERROR: DeviceIoCOntrol(EventGen) failed %x\n", Wnode);
} else {
TestList[j].EventsSent++;
GlobalEventsSent++;
}
Sleep(1000);
}
}
//
// Send event for unregistered guid
memcpy(&Wnode->WnodeHeader.Guid, &UnRegGuid, sizeof(GUID));
Wnode->WnodeHeader.Linkage = i;
DataPtr[0] = i;
f = DeviceIoControl( STBHandle,
IOCTL_WMI_GENERATE_EVENT,
Wnode,
Wnode->WnodeHeader.BufferSize,
NULL,
0,
&retsize,
NULL);
if (! f)
{
printf("ERROR: DeviceIoCOntrol(EventGen) failed\n");
} else {
GlobalEventsSent++;
}
Sleep(10000);
for (j = 0; j < TestCount; j++)
{
Status = WMINotificationRegistration(TestList[j].Guid,
FALSE,
NULL,
0,
NULL,
0,
0);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: WMINotificationRegistration disable %d failed %x\n", j, Status);
}
}
Status = WMINotificationRegistration(&GuidNull,
FALSE,
NULL,
0,
NULL,
0,
0);
if (Status != ERROR_SUCCESS)
{
printf("ERROR: WMINotificationRegistration disable GuidNull failed %x\n", Status);
}
free(Wnode);
for (j = 0; j < TestCount; j++)
{
if (TestList[j].EventsReceived != TestList[j].EventsSent)
{
printf("Error - Sent %d events, but received %d for %d\n",
TestList[j].EventsSent, TestList[j].EventsReceived, j);
}
printf("Error - Sent %d events, but received %d for %d\n",
TestList[j].EventsSent, TestList[j].EventsReceived, j);
}
if (GlobalEventsReceived != GlobalEventsSent)
{
printf("Error - Sent %d global events, but received %d\n",
GlobalEventsSent, GlobalEventsReceived);
}
printf("Error - Sent %d global events, but received %d\n",
GlobalEventsSent, GlobalEventsReceived);
done:
WMICloseBlock(DataBlockHandle);
CloseHandle(STBHandle);
}
typedef ULONG (*THREADFUNC)(
ULONG FirstTestNumber,
ULONG LastTestNumber
);
typedef struct
{
THREADFUNC ThreadFunc;
ULONG FirstTestNumber;
ULONG LastTestNumber;
} LAUNCHCTX, *PLAUNCHCTX;
ULONG LaunchThreadProc(PVOID Context)
{
PLAUNCHCTX LaunchCtx = (PLAUNCHCTX)Context;
(*LaunchCtx->ThreadFunc)(LaunchCtx->FirstTestNumber,
LaunchCtx->LastTestNumber);
return(0);
}
void LaunchThread(
THREADFUNC ThreadFunc,
ULONG FirstTestNumber,
ULONG LastTestNumber
)
{
PLAUNCHCTX LaunchCtx;
HANDLE ThreadHandle;
LaunchCtx = (PLAUNCHCTX)malloc(sizeof(LAUNCHCTX));
if (LaunchCtx != NULL)
{
LaunchCtx->ThreadFunc = ThreadFunc;
LaunchCtx->FirstTestNumber = FirstTestNumber;
LaunchCtx->LastTestNumber = LastTestNumber;
ThreadHandle = CreateThread(NULL,
0,
LaunchThreadProc,
&LaunchCtx,
0,
NULL);
if (ThreadHandle != NULL)
{
CloseHandle(ThreadHandle);
}
}
}
int _cdecl main(int argc, char *argv[])
{
printf("At Main in DC1\n");
QADTest(0, TestCount);
QSINTest(0, TestCount);
QSITTest(0, TestCount);
EventTest(0, TestCount);
return(ERROR_SUCCESS);
}