阅读:1784回复:6
NidsMRegisterDevice返回成功,CreatFile失败??
我在Ntddk中的ne2000的基础上改写.(我的系统是win98Se)
在Ne2000Initialize中NdisMSetAttributesEx() 后面NidsMRegisterDevice ................ UNICODE_STRING devname; UNICODE_STRING symbolname; NdisZeroMemory(MajorFunctions, sizeof(MajorFunctions)); MajorFunctions[IRP_MJ_CREATE] = MajorFunctions[IRP_MJ_CLOSE] = MajorFunctions[IRP_MJ_CLEANUP] = MajorFunctions[IRP_MJ_READ] = MajorFunctions[IRP_MJ_WRITE] = MajorFunctions[IRP_MJ_DEVICE_CONTROL] = myDispatchDeviceControl; NdisInitUnicodeString(&devname, L\"\\\\Device\\\\MyNdisDevice\"); NdisInitUnicodeString(&symbolname,L\"\\\\DosDevices\\\\MyNdisDevice\"); //Register the device for IoCtl Status = NdisMRegisterDevice( Ne2000MiniportBlock.NdisWrapperHandle, &devname, &symbolname, MajorFunctions, &(Adapter->pDeviceObject), &(Adapter->DeviceHandle) ); if(Status!=STATUS_SUCCESS) { KdPrint((\"NdisMRegisterDevice Fail\\n\")); return Status; } 用softice看NdisMregisterDevice返回值为0.(STATUS_SUCCESS). 在用户台程序中: hDevice = CreateFile(\"\\\\\\\\.\\\\MyNdisDevice\", // drive to open GENERIC_READ|GENERIC_WRITE, // //need R/W access to the drive 0, // exclusive mode NULL, // default security //attributes OPEN_EXISTING, // disposition 0, // file attributes NULL); // don\'t copy any file\'s // attributes if (hDevice == INVALID_HANDLE_VALUE) // we can\'t open the drive { errCode=GetLastError(); printf(\"creatfile fail .Err Code is %d\\n\"); return (FALSE); } Creatfile失败,并且errcode==2(File not found). 太郁闷了,帮帮我吧 [编辑 - 1/11/02 作者: eepaul] |
|
沙发#
发布于:2002-01-11 11:11
Win98se 的ndis driver 你如何编译的?? 教教我. I need it.
是否采用的是98ddk? 我正需要. 我跟你是同样的方法,不过我使用ntddk编译的.createfile 是成功的.或者你可以try to compile with ntddk, It\'s ok. |
|
|
板凳#
发布于:2002-01-11 12:41
我使用2000ddk变异的
|
|
地板#
发布于:2002-01-12 09:19
我仔细看了你的code, 跟俺的进行了对比.没有什么区别,but i am ok.
或者你用IoCreatDevice吧. 98的 NDIS 版本不支持NdisMRegisterDevice的.不过microsoft号称binary compatible. 我不十分信. 或者give u one more tips, 我在一篇文章看过, w2k编译的ndis driver如要跟98兼容, 必须打开一个选项开关,BINARY_COMPATIBLE=1才可. good luck. |
|
|
地下室#
发布于:2002-01-13 16:10
多谢了.
还是不行.但是Driver Studio 2.6的那个Vdev的例子是好的. 我把编译Vdev用到的编译选项都加上,还是不行. 也不知道什么原因.:( 实在不行,只有用DS了. |
|
5楼#
发布于:2002-01-19 23:51
找到原因了.
creatfile是,相应的dispatch函数也会被调用,这时 传入参数的Code值为0. 我以前的代码 switch(code){ case IOCTL_VNIC_READ: ...... Status=NDIS_STATUS_SUCCESS; break; default: Status=STATUS_UNSUCCESSFUL; } Irp->IoStatus.Information=nTotalBytes; Irp->IoStatus.Status=Status; IoCompleteRequest(Irp,IO_NO_INCREMENT ); return Status; } 所以CreatFile时Iodispatch返回STATUS_UNSUCCESSFUL, 所以CreatFile失败,将default:也改为NDIS_STATUS_SUCCESS; 就搞定 |
|
6楼#
发布于:2004-04-26 14:20
根据上面,的确可以。但是IO functions 执行了几次后,OID好像没有再发下来。好像被阻止了。不知兄台怎么解决的。可能是IO Control例程的问题。我发下的IRP代码是0x0,0x2,0xE
|
|
|