Replacing HalGetBusData

 

 

 

 

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

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值