ВУЗ:
Составители:
62
…
}
Можно использовать общую диспетчерскую функцию для IRP_MJ_READ
и IRP_MJ_WRITE.
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
…
DriverObject->MajorFunction[IRP_MJ_READ] = DispatchReadWrite;
DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite;
…
}
#pragma PAGEDCODE //Следующая функция будет подкачиваемой
NTSTATUS DispatchReadWrite(PDEVICE_OBJECT fdo, PIRP Irp)
{
PAGED_CODE() //Макрос, убеждающийся в том, что вызывающий
//поток запущен на уровне IRQL, который достаточно низок,
//чтобы разрешить подкачку
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) fdo->DeviceExtension;
IoMarkIrpPending(Irp);
StartPacket(&pdx->dqReadWrite, fdo, Irp, CancelRoutine);
return STATUS_PENDING;
}
#pragma LOCKEDCODE //Следующая функция будет заблокированной
VOID CancelRoutine(PDEVICE_OBJECT fdo, PIRP Irp)
{
PDEVICE_EXTENSION pdx =
(PDEVICE_EXTENSION) fdo->DeviceExtension;
CancelRequest(&pdx->dqReadWrite, Irp);
}
… } Можно использовать общую диспетчерскую функцию для IRP_MJ_READ и IRP_MJ_WRITE. NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { … DriverObject->MajorFunction[IRP_MJ_READ] = DispatchReadWrite; DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite; … } #pragma PAGEDCODE //Следующая функция будет подкачиваемой NTSTATUS DispatchReadWrite(PDEVICE_OBJECT fdo, PIRP Irp) { PAGED_CODE() //Макрос, убеждающийся в том, что вызывающий //поток запущен на уровне IRQL, который достаточно низок, //чтобы разрешить подкачку PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; IoMarkIrpPending(Irp); StartPacket(&pdx->dqReadWrite, fdo, Irp, CancelRoutine); return STATUS_PENDING; } #pragma LOCKEDCODE //Следующая функция будет заблокированной VOID CancelRoutine(PDEVICE_OBJECT fdo, PIRP Irp) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; CancelRequest(&pdx->dqReadWrite, Irp); } 62
Страницы
- « первая
- ‹ предыдущая
- …
- 60
- 61
- 62
- 63
- 64
- …
- следующая ›
- последняя »