2016-06-01 34 views
2

今、私のacpiドライバにこの機能を追加します。 機能は次のとおりです。BIOS通知を取得します。私はいくつかのドキュメントを検索し、コードacpiイベント通知の登録方法(AcpiInterfaces.RegisterForDeviceNotifications)

NTSTATUS 
XxxAddDevice(
    __in struct _DRIVER_OBJECT *DriverObject, 
    __in struct _DEVICE_OBJECT *PhysicalDeviceObject 
    ) 
{ 
. 
. 
. 

    status = STATUS_SUCCESS; 

    DebugPrint(("AddDevice: %p to %p->%p \n",fdo,fdoData->NextLowerDO,PhysicalDeviceObject)); 
    DebugPrint(("DeviceObject Flag = 0x%08x\n",fdo->Flags)); 
    DebugPrint(("DevicePnPState = %d\n", fdoData->DevicePnPState)); 
    { 
     //PACPI_INTERFACE_STANDARD2 pInterface = 
     // ExAllocatePool(PagedPool, sizeof(ACPI_INTERFACE_STANDARD2)); 
     ACPI_INTERFACE_STANDARD Interfaces = {0}; 
     if (&Interfaces == NULL) 
     { 
      goto FuncEnd; 
     } 
     //RtlFillMemory(pInterface, sizeof(ACPI_INTERFACE_STANDARD2), 0x00); 
     status = GetAcpiInterfaces(fdo, &Interfaces); 
     if (!NT_SUCCESS(status)) 
     { 
      DebugPrint(("GetAcpiInterfaces Failed\n")); 
     } 
     else 
     { 
      DebugPrint(("******GetAcpiInterfaces Succeed\n")); 
      DebugPrint(("******ACPI_INTERFACE_STANDARD2 Version == %d\n", Interfaces.Version)); 
      DebugPrint(("******AcpiInterface.RegisterForDeviceNotifications Address == %x\n", 
       Interfaces.RegisterForDeviceNotifications)); 
      //Interfaces.InterfaceReference(Interfaces.Context); 
     } 

     if (Interfaces.RegisterForDeviceNotifications != NULL) 
     { 
      status = Interfaces.RegisterForDeviceNotifications(
       Interfaces.Context, 
       ACPIDeviceNotifyHandler, 
       fdoData); 
      if (!NT_SUCCESS(status)) 
      { 
       DebugPrint(("RegisterForDeviceNotifications Failed\n")); 
      } 
      else 
      { 
       DebugPrint(("RegisterForDeviceNotifications Succeed\n")); 
      } 
     } 
     //Free Memory 
     //ExFreePool(pInterface); 

//  PDEVICE_OBJECT target = fdoData->NextLowerDO; 
//  RegisterACPINotifyEvent(target, fdoData); 
     status = STATUS_SUCCESS; 
    } 

FuncEnd: 

    return status; 
} 

NTSTATUS 
GetAcpiInterfaces(
IN PDEVICE_OBJECT Pdo, 
OUT PACPI_INTERFACE_STANDARD AcpiInterfaces 
) 
{ 
    NTSTATUS    Status = STATUS_NOT_SUPPORTED; 
    PIRP     Irp; 
    PIO_STACK_LOCATION  IrpSp; 
    PDEVICE_OBJECT   LowerPdo = NULL; 

    KEVENT event; 
    DebugPrint(("Enter GetAcpiInterfaces...\n")); 
    KeInitializeEvent(&event, NotificationEvent, FALSE); 
    // Only need to do this once 
    if (!LowerPdo) 
    { 
     LowerPdo = IoGetAttachedDeviceReference(Pdo); 

     // Allocate an IRP for below Irp = IoAllocateIrp 
     // (LowerPdo->StackSize, FALSE); // Get stack size from 
     // PDO 
     Irp = IoAllocateIrp(LowerPdo->StackSize, FALSE); 
     if (Irp == NULL) 
     { 
      DebugPrint(("IoAllocateIrp Failed...\n")); 
      Status = STATUS_UNSUCCESSFUL; 
      return Status; 
     } 
     IrpSp = IoGetNextIrpStackLocation(Irp); 
     // 
     // Use QUERY_INTERFACE to get the address of the direct- 
     // call ACPI interfaces. 
     // 
     IrpSp->MajorFunction = IRP_MJ_PNP; 
     IrpSp->MinorFunction = IRP_MN_QUERY_INTERFACE; 
     IrpSp->Parameters.QueryInterface.InterfaceType = (LPGUID)&GUID_ACPI_INTERFACE_STANDARD; 
     IrpSp->Parameters.QueryInterface.Version = 1; 
     IrpSp->Parameters.QueryInterface.Size = sizeof(ACPI_INTERFACE_STANDARD); 
     IrpSp->Parameters.QueryInterface.Interface = (PINTERFACE)AcpiInterfaces; 
     IrpSp->Parameters.QueryInterface.InterfaceSpecificData = NULL; 
     IoSetCompletionRoutine(Irp, ACPIDriverSynchronousRequest, &event, TRUE, TRUE, TRUE); 
     DebugPrint(("******Before IoCallDriver.Status == %08X\n", Status)); 
     Status = IoCallDriver(LowerPdo, Irp); 
     DebugPrint(("******IoCallDriver.Status == %08X\n",Status)); 
     //Wait for complete 
     if (Status == STATUS_PENDING) 
     { 
      DebugPrint(("KeWaitForSingleObject QueryInterface...\n")); 
      Status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); 
      DebugPrint(("KeWaitForSingleObject.Status == %08X\n", Status)); 
      DebugPrint(("pNewIrp->IoStatus.Status == %08X\n", Irp->IoStatus.Status)); 
     } 

     //IoFreeIrp(Irp); 
    } 
    return Status; 
} 

CompletionRoutineはSTATUS_SUCCESSを返しますが、インターフェイスがまだ空であるを書く...

Parameters.QueryInterface.Interfaceが満たされることはありません... はいくつかのいずれかでき 助けて ??? IRP_MN_QUERY_INTERFACE enter link description here enter image description here

答えて

1

OKについて MSDNは、今、私は私の質問には、自分自身に答えます。 ドライバは\ Driver \ Acpiにインストールする必要があります。 dpinst.exeとパラメータ "/ f"を使用してインストールしてください

関連する問題