这篇博文是 以文件句柄形式调用其它驱动程序
驱动程序调用驱动程序的方式有很多..
本篇博文是 同步调用 ,其它方式迟一点再讨论
先上效果图
接下来的几篇博文都需要一个被测试的驱动...先准备这个
#define DEVICE_NAME "\\Device\\DRIVERTEST_DeviceName"
#define SYMLINK_NAME "\\DosDevices\\DRIVERTEST_DeviceName"
PRESET_UNICODE_STRING(usDeviceName, DEVICE_NAME);
PRESET_UNICODE_STRING(usSymlinkName, SYMLINK_NAME);
typedef struct{
IRP *currentPendingIRP;
KTIMER kTimer;
KDPC Dpc;
}DEVICE_EXTENSION;
KdPrint(("被测试的驱动 DriverEntry hahah ternsoft.com"));
DEVICE_EXTENSION* pDex=(DEVICE_EXTENSION*)pdoDeviceObj->DeviceExtension;
KeInitializeTimer(&pDex->kTimer);
KeInitializeDpc(&pDex->Dpc,CustomDpc,pdoDeviceObj);
在DriverEntry初始化一些设置
NTSTATUS DRIVERTEST_DispatchRead(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
KdPrint(("DRIVERTEST_DispatchRead"));
// NTSTATUS status = STATUS_SUCCESS;
// Irp->IoStatus.Status = status;
// Irp->IoStatus.Information = 0;
// IoCompleteRequest(Irp, IO_NO_INCREMENT);
// return status;
DEVICE_EXTENSION *pDex=(DEVICE_EXTENSION*)DeviceObject->DeviceExtension;
pDex->currentPendingIRP=Irp;
LARGE_INTEGER liTimeout=RtlConvertLongToLargeInteger(-10*3000000);//3秒
IoMarkIrpPending(Irp);//将IRP设置为挂起
KeSetTimer(&pDex->kTimer,liTimeout,&pDex->Dpc);
return STATUS_PENDING;
}
VOID
CustomDpc(
IN struct _KDPC *Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2
){
KdPrint(("CustomDpc"));
DEVICE_OBJECT *pDevObj=(DEVICE_OBJECT*)DeferredContext;
DEVICE_EXTENSION *pDex=(DEVICE_EXTENSION*)pDevObj->DeviceExtension;
IRP *pIrp=pDex->currentPendingIRP;
KdPrint(("完成IRP_MG_READ irp"));
pIrp->IoStatus.Status=STATUS_SUCCESS;
pIrp->IoStatus.Information=0;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
}
上面那些是被测试驱动程序的部分,,,下面是测试程序A的部分
KdPrint(("开始读"));
HANDLE hDevice;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING ustrDeviceName;
RtlInitUnicodeString(&ustrDeviceName,L"\\Device\\DRIVERTEST_DeviceName");
InitializeObjectAttributes(&ObjectAttributes,&ustrDeviceName,OBJ_CASE_INSENSITIVE,NULL,NULL);
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS status2=ZwCreateFile(&hDevice,GENERIC_ALL|SYNCHRONIZE,&ObjectAttributes,&IoStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
if (NT_SUCCESS(status2))
{
ZwReadFile(hDevice,NULL,NULL, NULL,&IoStatusBlock,NULL,0,NULL,NULL);
}
ZwClose(hDevice);
KdPrint(("读结束"));
注意,要先运行被测试程序,再运行测试程序A