/*++ Copyright (c) 1991-1998 Microsoft Corporation Module Name: acpitl.c Abstract: Environment: kernel mode only Notes: Things acpi.sys needs to do. 1) Call AmliHook_InitTestHookInterface() in its DriverEntry() very early. This functyion will hook the amli functions if acpiver.sys is installed. 2) Call AmliHook_UnInitTestHookInterface() on driver unload. This is not inteded to be called to disable Amli Hooking at runtime. --*/ /* #include "wdm.h" #include "ntdddisk.h" #include "stdarg.h" #include "stdio.h" */ //#include "wdm.h" #include "pch.h" //#include "amlihook.h" #ifdef POOL_TAGGING #ifdef ExAllocatePool #undef ExAllocatePool #endif #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'ihVA') #endif // // Globals // PCALLBACK_OBJECT g_AmliHookCallbackObject = NULL; ULONG g_AmliHookTestFlags=0; ULONG g_AmliHookIdCounter=0; ULONG g_AmliHookEnabled = 0; // // -- Get dbg flags // extern NTSTATUS OSGetRegistryValue( IN HANDLE ParentHandle, IN PWSTR ValueName, OUT PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64 *Information); extern NTSTATUS OSOpenUnicodeHandle( PUNICODE_STRING UnicodeKey, HANDLE ParentHandle, PHANDLE ChildHandle); extern NTSTATUS OSCloseHandle( HANDLE Key); // // Internal function defines. // ULONG AmliHook_GetUniqueId( VOID); // // Functions // ULONG AmliHook_GetDbgFlags( VOID) { UNICODE_STRING DriverKey; HANDLE DriverKeyHandle; NTSTATUS status; PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64 RegValue=NULL; ULONG DebugFlags; RtlInitUnicodeString( &DriverKey, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\acpiver"); status = OSOpenUnicodeHandle( &DriverKey, NULL, &DriverKeyHandle); if (!NT_SUCCESS(status)) { return(0); } status = OSGetRegistryValue( DriverKeyHandle, L"AcpiCtrl", &RegValue); if (!NT_SUCCESS(status)) { OSCloseHandle(DriverKeyHandle); return(0); } if(RegValue->DataLength == 0 || RegValue->Type != REG_DWORD) { ExFreePool(RegValue); return(0); } DebugFlags = *((ULONG*)( ((PUCHAR)RegValue->Data))); ExFreePool(RegValue); return(DebugFlags); } ULONG AmliHook_GetUniqueId( VOID) { // BUGBUG For some reason acpi.sys // will not link with this. // Acpiver doesn't use the ID yet. // //return(InterlockedIncrement( // &g_AmliHookIdCounter)); g_AmliHookIdCounter++; return(g_AmliHookIdCounter); } VOID AmliHook_InitTestData( PAMLIHOOK_DATA Data) { RtlZeroMemory(Data,sizeof(AMLIHOOK_DATA)); Data->Id = AmliHook_GetUniqueId(); } PAMLIHOOK_DATA AmliHook_AllocAndInitTestData( VOID) { PAMLIHOOK_DATA Data = ExAllocatePool(NonPagedPool,sizeof(AMLIHOOK_DATA)); if(!Data) { AmliHook_ProcessInternalError(); return(NULL); } AmliHook_InitTestData(Data); return(Data); } // // AmliHook_UnInitTestHookInterface // VOID AmliHook_UnInitTestHookInterface( VOID) { if(g_AmliHookCallbackObject) ObDereferenceObject(g_AmliHookCallbackObject); } // // AmliHook_InitTestHookInterface // NTSTATUS AmliHook_InitTestHookInterface( VOID) { NTSTATUS status = STATUS_SUCCESS; g_AmliHookCallbackObject = NULL; g_AmliHookIdCounter = 0; g_AmliHookEnabled = 0; g_AmliHookTestFlags = AmliHook_GetDbgFlags(); if(g_AmliHookTestFlags & AMLIHOOK_TEST_FLAGS_HOOK_MASK) { // //--- We want to hook the AMLI.api interface. //--- So create the notify interface. // OBJECT_ATTRIBUTES objectAttributes; UNICODE_STRING CallBackName; RtlInitUnicodeString(&CallBackName,AMLIHOOK_CALLBACK_NAME); InitializeObjectAttributes ( &objectAttributes, &CallBackName, OBJ_CASE_INSENSITIVE | OBJ_PERMANENT , NULL, NULL); status = ExCreateCallback( &g_AmliHookCallbackObject, &objectAttributes, TRUE, TRUE); if(!NT_SUCCESS(status)) { // //--- Failed // AmliHook_ProcessInternalError(); g_AmliHookCallbackObject = NULL; return(status); } else { // //--- Functions are hooked. // g_AmliHookEnabled = AMLIHOOK_ENABLED_VALUE; } } return(status); } // // AmliHook_TestNotify // NTSTATUS AmliHook_TestNotify( PAMLIHOOK_DATA Data) { if(g_AmliHookTestFlags & AMLIHOOK_TEST_FLAGS_NO_NOTIFY_ON_CALL) { // //--- do not notify on call, // if(Data->State & AMLIHOOK_TEST_DATA_CALL_STATE_MASK) return(STATUS_SUCCESS); } if(!g_AmliHookCallbackObject) { AmliHook_ProcessInternalError(); return(STATUS_UNSUCCESSFUL); } ExNotifyCallback( g_AmliHookCallbackObject, Data, NULL); return(STATUS_SUCCESS); } NTSTATUS AmliHook_TestNotifyRet( PAMLIHOOK_DATA Data, NTSTATUS Status) { if(!g_AmliHookCallbackObject) { AmliHook_ProcessInternalError(); return(STATUS_UNSUCCESSFUL); } Data->State = AMLIHOOK_TEST_DATA_STATE_RETURN; Data->Ret = Status; ExNotifyCallback( g_AmliHookCallbackObject, Data, NULL); return(Data->Ret); } VOID AmliHook_ProcessInternalError( VOID) { if(g_AmliHookTestFlags & AMLIHOOK_TEST_FLAGS_DBG_ON_ERROR) DbgBreakPoint(); }