ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »
