日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IRP 续二

發布時間:2025/3/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的IRP 续二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。