static VOID TestPrivateFunctions(VOID) { UNICODE_STRING ExAllocateCallBackName = RTL_CONSTANT_STRING(L"ExAllocateCallBack"); UNICODE_STRING ExFreeCallBackName = RTL_CONSTANT_STRING(L"ExFreeCallBack"); PEX_CALLBACK_ROUTINE_BLOCK CallbackBlock; INT CallbackContext; if (!ExAllocateCallBack) ExAllocateCallBack = MmGetSystemRoutineAddress(&ExAllocateCallBackName); if (!ExFreeCallBack) ExFreeCallBack = MmGetSystemRoutineAddress(&ExFreeCallBackName); if (skip(ExAllocateCallBack && ExFreeCallBack, "ExAllocateCallBack and/or ExFreeCallBack unavailable\n")) return; CallbackBlock = ExAllocateCallBack(ExCallbackFunction, &CallbackContext); ok(CallbackBlock != NULL, "CallbackBlock = NULL\n"); if (skip(CallbackBlock != NULL, "Allocating callback failed\n")) return; ok_eq_pointer(CallbackBlock->Function, ExCallbackFunction); ok_eq_pointer(CallbackBlock->Context, &CallbackContext); ok_eq_hex(KmtGetPoolTag(CallbackBlock), 'brbC'); ExFreeCallBack(CallbackBlock); }
static VOID TestDriverObject( IN PDRIVER_OBJECT DriverObject, IN PCUNICODE_STRING RegistryPath OPTIONAL, IN DRIVER_STATUS DriverStatus) { BOOLEAN CheckThisDispatchRoutine; PVOID FirstMajorFunc; int i; UNICODE_STRING HardwareDatabase = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\HARDWARE\\DESCRIPTION\\SYSTEM"); UNICODE_STRING RegPath = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\ControlSet001\\Services\\Kmtest-IoDeviceObject"); UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"\\Driver\\Kmtest-IoDeviceObject"); UNICODE_STRING ServiceKeyName = RTL_CONSTANT_STRING(L"Kmtest-IoDeviceObject"); BOOLEAN Equal; ok(DriverObject->Size == sizeof(DRIVER_OBJECT), "Size does not match, got %x\n",DriverObject->Size); ok(DriverObject->Type == 4, "Type does not match 4. got %d\n", DriverObject->Type); if (DriverStatus == DriverStatusEntry) { ok(DriverObject->DeviceObject == NULL, "Expected DeviceObject pointer to be 0, got %p\n", DriverObject->DeviceObject); ok (DriverObject->Flags == DRVO_LEGACY_DRIVER, "Expected Flags to be DRVO_LEGACY_DRIVER, got %lu\n", DriverObject->Flags); ok(DriverObject->DriverStart < (PVOID)TestEntry, "DriverStart is %p, expected < %p\n", DriverObject->DriverStart, (PVOID)TestEntry); ok(DriverObject->DriverSize > 0x2000, "DriverSize 0x%lx\n", DriverObject->DriverSize); ok_eq_pointer(DriverObject->DriverExtension, (PDRIVER_EXTENSION)(DriverObject + 1)); ok_eq_pointer(DriverObject->DriverExtension->DriverObject, DriverObject); ok_eq_pointer(DriverObject->DriverExtension->AddDevice, NULL); ok_eq_ulong(DriverObject->DriverExtension->Count, 0UL); Equal = RtlEqualUnicodeString(RegistryPath, &RegPath, FALSE); ok(Equal, "RegistryPath is '%wZ'\n", RegistryPath); ok((ULONG_PTR)RegistryPath % PAGE_SIZE == 0, "RegistryPath %p not page-aligned\n", RegistryPath); ok_eq_pointer(RegistryPath->Buffer, (PWCHAR)(RegistryPath + 1)); ok_eq_uint(RegistryPath->MaximumLength, RegistryPath->Length); Equal = RtlEqualUnicodeString(&DriverObject->DriverExtension->ServiceKeyName, &ServiceKeyName, FALSE); ok(Equal, "ServiceKeyName is '%wZ'\n", &DriverObject->DriverExtension->ServiceKeyName); ok_eq_tag(KmtGetPoolTag(DriverObject->DriverExtension->ServiceKeyName.Buffer), ' oI'); ok_eq_uint((KmtGetPoolType(DriverObject->DriverExtension->ServiceKeyName.Buffer) - 1) & BASE_POOL_TYPE_MASK, NonPagedPool); ok_eq_uint(DriverObject->DriverExtension->ServiceKeyName.MaximumLength, DriverObject->DriverExtension->ServiceKeyName.Length + sizeof(UNICODE_NULL)); ok_eq_uint(DriverObject->DriverExtension->ServiceKeyName.Buffer[DriverObject->DriverExtension->ServiceKeyName.Length / sizeof(WCHAR)], UNICODE_NULL); Equal = RtlEqualUnicodeString(&DriverObject->DriverName, &DriverName, FALSE); ok(Equal, "DriverName is '%wZ'\n", &DriverObject->DriverName); ok_eq_tag(KmtGetPoolTag(DriverObject->DriverName.Buffer), ' oI'); ok_eq_uint((KmtGetPoolType(DriverObject->DriverName.Buffer) - 1) & BASE_POOL_TYPE_MASK, PagedPool); ok_eq_uint(DriverObject->DriverName.MaximumLength, DriverObject->DriverName.Length); // TODO: show that both string and buffer are constants inside ntos Equal = RtlEqualUnicodeString(DriverObject->HardwareDatabase, &HardwareDatabase, FALSE); ok(Equal, "HardwareDatabase is '%wZ'\n", DriverObject->HardwareDatabase); ok_eq_uint(DriverObject->HardwareDatabase->MaximumLength, DriverObject->HardwareDatabase->Length + sizeof(UNICODE_NULL)); ok_eq_uint(DriverObject->HardwareDatabase->Buffer[DriverObject->HardwareDatabase->Length / sizeof(WCHAR)], UNICODE_NULL); ok(DriverObject->DriverInit == DriverEntry, "DriverInit is %p, expected %p\n", (PVOID)DriverObject->DriverInit, (PVOID)DriverEntry); } else if (DriverStatus == DriverStatusIrp) { ok(DriverObject->DeviceObject != NULL, "Expected DeviceObject pointer to non null\n"); ok (DriverObject->Flags == (DRVO_LEGACY_DRIVER | DRVO_INITIALIZED), "Expected Flags to be DRVO_LEGACY_DRIVER | DRVO_INITIALIZED, got %lu\n", DriverObject->Flags); } else if (DriverStatus == DriverStatusUnload) { ok(DriverObject->DeviceObject != NULL, "Expected DeviceObject pointer to non null\n"); ok (DriverObject->Flags == (DRVO_LEGACY_DRIVER | DRVO_INITIALIZED | DRVO_UNLOAD_INVOKED), "Expected Flags to be DRVO_LEGACY_DRIVER | DRVO_INITIALIZED | DRVO_UNLOAD_INVOKED, got %lu\n", DriverObject->Flags); } else ASSERT(FALSE); /* Select a routine that was not changed */ FirstMajorFunc = DriverObject->MajorFunction[1]; ok(FirstMajorFunc != 0, "Expected MajorFunction[1] to be non NULL\n"); if (!skip(FirstMajorFunc != NULL, "First major function not set!\n")) { for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { if (DriverStatus > 0) CheckThisDispatchRoutine = (i > 3) && (i != 14); else CheckThisDispatchRoutine = TRUE; if (CheckThisDispatchRoutine) { ok(DriverObject->MajorFunction[i] == FirstMajorFunc, "Expected MajorFunction[%d] to match %p\n", i, FirstMajorFunc); } } } }