Replacing HalGetBusData

来源:互联网 发布:西门子200编程软件 编辑:程序博客网 时间:2024/06/06 14:20

 

 

 

 

NTSTATUS

HtsReadWriteConfig(

    PDEVICE_OBJECT DeviceObject,

    ULONG WhichSpace,

    PVOID Buffer,

    ULONG Offset,

    ULONG Length,

    BOOLEAN ReadConfig)

{

    ASSERT(DeviceObject);

    ASSERT(Buffer);

    ASSERT(Length);

 

    PIRP Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);

 

    if (!Irp) {

      

        return STATUS_INSUFFICIENT_RESOURCES;

    }

    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;

 

    KEVENT Event;

    KeInitializeEvent(&Event, NotificationEvent, FALSE);

 

    IoSetCompletionRoutine(Irp,HtsGenericCompletion,

                           &Event, TRUE, TRUE, TRUE);

 

    PIO_STACK_LOCATION IoStack = IoGetNextIrpStackLocation(Irp);

    IoStack->MajorFunction= IRP_MJ_PNP;

    IoStack->MinorFunction= ReadConfig ? IRP_MN_READ_CONFIG : IRP_MN_WRITE_CONFIG;

    IoStack->Parameters.ReadWriteConfig.WhichSpace = WhichSpace;

    IoStack->Parameters.ReadWriteConfig.Buffer = Buffer;

    IoStack->Parameters.ReadWriteConfig.Offset = Offset;

    IoStack->Parameters.ReadWriteConfig.Length = Length;

 

    if (ReadConfig) {

 

        RtlZeroMemory(Buffer, Length);

    }

 

    NTSTATUS Status = IoCallDriver(DeviceObject, Irp);

    if (Status == STATUS_PENDING) {

       

       KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);

 

       Status = Irp->IoStatus.Status;

    }

 

    IoFreeIrp(Irp);

 

    return Status;

}

 

NTSTATUS

HtsGenericCompletion (

    IN PDEVICE_OBJECT   DeviceObject,

    IN PIRP             Irp,

    IN PVOID            Context

    )

 

{

    UNREFERENCED_PARAMETER (DeviceObject);   

    KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);

    return STATUS_MORE_PROCESSING_REQUIRED; // Keep this IRP

}

 

原创粉丝点击