IRP 续二
在第一篇中ring3的調用程序設置了DeviceIoControl 但是在驅動中未設置IRP_MJ_DEVICE_CONTROL現在補上代碼
#define IOCODE CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS ) //0x0000-0x7FFF:微軟保留 0x800-0xFFF 由用戶自定義(因為我在ring3用800) #pragma code_seg( "PAGE" ) NTSTATUS DeviceControl(PDEVICE_OBJECT pDevice, PIRP irp) {PCHAR buffer=NULL;ULONG InBufferLenth=0;ULONG OutBufferLenth=0;ULONG code=0;PDEVICE_EXT pDExt;PIO_STACK_LOCATION pStack = NULL; pDExt=(PDEVICE_EXT)pDevice->DeviceExtension;pStack = IoGetCurrentIrpStackLocation( irp ); InBufferLenth=pStack->Parameters.DeviceIoControl.InputBufferLength;OutBufferLenth=pStack->Parameters.DeviceIoControl.OutputBufferLength;code=pStack->Parameters.DeviceIoControl.IoControlCode;switch(code){case IOCODE:KdPrint(("DeviceControl In ox800 \r\n"));buffer=(PCHAR)irp->AssociatedIrp.SystemBuffer;//讀取ring3 下DeviceIoControl的輸入緩沖區數據if(buffer!=NULL)KdPrint(("buffer form DeviceIoControl :%s\r\n",buffer));//設置輸出緩沖區數據 ring3 下DeviceIoControl的輸出緩沖區數據RtlFillMemory(buffer,OutBufferLenth,'A');break;default:OutBufferLenth=0;break;}irp->IoStatus.Information = OutBufferLenth; irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest( irp, IO_NO_INCREMENT ); KdPrint(( "Irp_DispatchRoutine 執行完畢" )); return STATUS_SUCCESS; }入口處為其指定派遣函數
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DeviceControl;
ring3中 DeviceIoControl
BOOL WINAPI DeviceIoControl(__in HANDLE hDevice,//已經打開的設備__in DWORD dwIoControlCode,//控制碼__in_bcount_opt(nInBufferSize) LPVOID lpInBuffer,//輸入緩沖區__in DWORD nInBufferSize,//輸入緩存區大小__out_bcount_part_opt(nOutBufferSize, *lpBytesReturned) LPVOID lpOutBuffer,//輸出緩沖區__in DWORD nOutBufferSize,//輸出緩沖區大小__out_opt LPDWORD lpBytesReturned,//實際返回字節數 就是驅動程序中對應的派遣函數中IRP->IoStatus.Information__inout_opt LPOVERLAPPED lpOverlapped//是否Overlap操作);DWORD dwIoControlCode =CTL_CODE(DeviceType,Funtion,Method,Accsee)
DeviceType:對應的時驅動程序中創建設備時的類型 查看IRP 續一的CreateDevice 是FILE_DEVICE_UNKNOWN
Funtion :驅動程序定義的IOCTL碼0x0000-0x7FFF:微軟保留 0x800-0xFFF 由用戶自定義 我這邊是0x800
Method :操作模式 包含
METHOD_BUFFERED? 緩沖區模式操作
METHOD_IN_DIRECT 直接寫方式操作
METHOD_OUT_DIRECT 直接讀方式操作
METHOD_NEITHER? 其他操作
Accsee :訪問權限 如果無特殊要求一般是FILE_ANY_ACCESS
運行結果
?
?
轉載于:https://www.cnblogs.com/xmcc/archive/2012/04/10/2441503.html
總結
- 上一篇: C++:关于“error C2374:
- 下一篇: 我的创新转型理念