阅读:1883回复:14
请教IoControl问题
写了一个中间层驱动,
在使用iocontrol的时候, 发现在IRP中的结构乱了 代码如下: NTSTATUS IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION irpSp; ULONG functionCode; NDIS_STATUS status; ULONG dataLength =0; status = NDIS_STATUS_SUCCESS; irpSp = IoGetCurrentIrpStackLocation(Irp); functionCode=irpSp->Parameters.DeviceIoControl.IoControlCode; if(functionCode == IOCTL_SET_PORT) { short wPort = 0; memcpy(&wPort,irpSp->Parameters.DeviceIoControl.Type3InputBuffer,sizeof(short)); g_wPort = wPort; } else if(functionCode == IOCTL_BEGIN_TRANS) { g_bTrans = 1; } else if(functionCode == IOCTL_STOP_TRANS) { g_bTrans = 0; } Irp->IoStatus.Status = status; Irp->IoStatus.Information = dataLength; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } 外部则是调用CreateFile,然后用DeviceIoControl 结果发现dwIoControlCode变成了nInBufferSize |
|
沙发#
发布于:2003-12-29 16:23
是否使用了UNICODE
|
|
板凳#
发布于:2003-12-29 17:07
好像没有吧?
|
|
论坛版主
|
地板#
发布于:2003-12-29 17:51
确定你上层来的数据是否使用的是TYPE3INPUTBUFFER,你返回上层的DATALENGTH忘了设了?
IOCTL是怎么定义的?上层的DEVICEIOCONTROL是怎么用的? |
|
地下室#
发布于:2003-12-30 08:41
下面是测试的代码
m_hFile=CreateFile(\"\\\\\\\\.\\\\TransUDPIoDispatchDevice\", GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0 ); BOOL bRet = FALSE; DWORD dwIo = 0; dwIo = (DWORD)IOCTL_SET_PORT; DWORD dwRet; bRet = DeviceIoControl( m_hFile, dwIo, &m_Port, sizeof(short), NULL, 0, &dwRet, NULL ); 定义如下: #define FILE_DEVICE_TRANSUDP 0x9000 #define METHOD_BUFFERED 0 #define FILE_ANY_ACCESS 0 0 #define CTL_CODE( DeviceType, Function, Method, Access ) ( \\ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \\ ) #define IOCTL_SET_PORT (ULONG) CTL_CODE(FILE_DEVICE_TRANSUDP, 1 , METHOD_BUFFERED, FILE_ANY_ACCESS) |
|
论坛版主
|
5楼#
发布于:2003-12-30 11:46
有些地方确实没试过你这样行不行,这些地方是:
bRet = DeviceIoControl( m_hFile, dwIo, &m_Port, sizeof(short), NULL, 0, &dwRet, NULL ); 输出缓冲区你不要,用NULL不知道是否有影响 你可以试试给一个输出缓冲区 #define METHOD_BUFFERED 0 这个你是摘录的WIN的定义还是你自己定义的?这个可以不定义,改了会有影响的。 你这儿用的METHOD_BUFFERED,那传到下层的数据不再irpSp->Parameters.DeviceIoControl.Type3InputBuffer,在pIrp->AssociatedIrp.SystemBuffer 其它参数我使用的和你不一样,我给你我用了可以得吧 CreateFile( name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); #define FILE_DEVICE_TRANSUDP 0x9000 这个忘了WIN留给用户的是哪些了,越大越好 |
|
6楼#
发布于:2003-12-30 13:04
这些东西,是我根据Packet里面的稍加修改弄过来的
DeviceIoControl的参数是合法的 CreateFile参数也合法 那些Buffer,我也指定过,结果还是一样 |
|
论坛版主
|
7楼#
发布于:2003-12-31 10:50
那你指的DWIOCONTROLCODE变成了NINBUFFERSIZE是指什么时候?
PACKET弄过来的?能说清楚一点吗? |
|
8楼#
发布于:2004-01-02 13:13
主要是在驱动里收到的irp结构中的数据位置不正确
我的所有定义,和调用方法都是根据Packet例子里的方法作相关修改的 |
|
论坛版主
|
9楼#
发布于:2004-01-06 16:01
对不起,这几天没来,你说IRP里面数据域和你想象不一样,你是怎么判断的?用调试工具还是你应用的时候直接用了偏移量?
|
|
10楼#
发布于:2004-01-09 08:36
我用softice看过
我用Packet例子里面的方法来解析IRP内容的 具体代码在上面贴了 |
|
论坛版主
|
11楼#
发布于:2004-01-09 11:52
你再看看是不是你对上层发下来的参数存放位置理解有偏差,这些参数好多用的是联合,我看你用的是METHOD_BUFFERED,但是它的参数不是在Parameters.DeviceIoControl.Type3InputBuffer,而是pIrp->AssociatedIrp.SystemBuffer,用的方式不一样,这些联合存放的参数意义就不一样了。
|
|
12楼#
发布于:2004-01-09 14:07
那请问,如果我采用METHOD_BUFFERED
那我从哪里取得上层传下来的控制码(dwIoControlCode)那? |
|
论坛版主
|
13楼#
发布于:2004-01-09 21:01
控制码的地方一样,但是数据缓冲区不同,不过你再试试,说不定和文挡的不一样喃:)
|
|
论坛版主
|
14楼#
发布于:2004-01-09 21:01
控制码的地方一样,但是数据缓冲区不同,不过你再试试其他的是不是也有不同,说不定和文挡的不一样喃:)
|
|