阅读:3438回复:33
中间层接受数据的问题请指教
1.PtReceive和PtReceivePacket分别会在什么情况下调用,ddk上说的实在没看懂
2.为什么我试xpassthru总是进不去PtReceive但却可以进PtReceiveComplete 3.ptreceivepacket或MPReturnPacket中没有如ptreceive 中的LookAheadBuffer那我要拿packet的数据该怎么办 |
|
最新喜欢:![]() |
沙发#
发布于:2004-04-06 09:10
老大我在mphalt的最后写NDISMDregisterDevice居然说NDIS.sys有IRPlevel错误,到底应该在什么地方做,现在我那个驱动卸载不了,我只好重装系统了,老大快来帮忙
|
|
板凳#
发布于:2004-04-04 16:37
我放在NDISIMRegisterLayeredMiniport之后就可以了,能不能解释一下是为什么,还有我应该在什么时候调用NdisMDeregisterDevice
到底是halt还是unload,还是无所谓 |
|
地板#
发布于:2004-04-04 16:05
我写的是两斜线,还是不行返回的结果是NDIS_STATUS_NOT_SUPPORTED按照DDK的说法是调用者不是MINIPORT我这个是中间层,当然不是MINIPORT,那到底要怎么样才行
|
|
地下室#
发布于:2004-04-02 17:56
靠!
我明明改了吗,怎么一发就变了。 你把一个反斜杠,该为两个反斜杠 |
|
5楼#
发布于:2004-04-02 17:54
sorry
#define NT_DEVICE_NAME L"\\Device\\MPassthru" #define DOS_DEVICE_NAME L"\\DosDevices\\MPassthru" |
|
6楼#
发布于:2004-04-02 17:48
老大是不是写错了,你写的更我前两行完全一样
|
|
7楼#
发布于:2004-04-02 17:40
应该是
#define NT_DEVICE_NAME L"\\Device\\MPassthru" #define DOS_DEVICE_NAME L"\\DosDevices\\MPassthru" 吧 |
|
8楼#
发布于:2004-04-02 17:28
老大我用#define BINARY_COMPATIBLE 0编过了不过运行status不是success
所有相关的如下 #define NT_DEVICE_NAME L"\\Device\\MPassthru" #define DOS_DEVICE_NAME L"\\DosDevices\\MPassthru" PDEVICE_OBJECT pDeviceObject = NULL; NDIS_HANDLE mNdisDeviceHandle= NULL; UNICODE_STRING mDeviceName; UNICODE_STRING mSymbolicName; PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; NdisInitUnicodeString(&mDeviceName, NT_DEVICE_NAME); NdisInitUnicodeString(&mSymbolicName,DOS_DEVICE_NAME); DispatchTable[IRP_MJ_CREATE] = PassthruDispatch; DispatchTable[IRP_MJ_CLEANUP] = PassthruDispatch; DispatchTable[IRP_MJ_CLOSE] = PassthruDispatch; DispatchTable[IRP_MJ_DEVICE_CONTROL] = PassthruDispatch; DispatchTable[IRP_MJ_READ] = PassthruDispatch; //紧接NdisMInitializeWrapper Status = NdisMRegisterDevice( WrapperHandle, &mDeviceName, &mSymbolicName, &DispatchTable[0], &pDeviceObject, &mNdisDeviceHandle ); WrapperHandle是NdisMInitializeWrapper带出来的 结果是不成功,帮我看看吧 |
|
9楼#
发布于:2004-04-02 16:05
#define MINIPORT_WDM 1
或则 #define NDIS_WDM 1 或 #define BINARY_COMPATIBLE 0 到 prexsim.h 具体我记不请了。 |
|
10楼#
发布于:2004-04-02 16:03
上面问题还没解决,
还有老大IN PDRIVER_DISPATCH MajorFunctions[] 不是把DriverObject->MajorFunction传进去而是自己定义 PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1]; 然后往里面传呀 |
|
11楼#
发布于:2004-04-02 15:00
老大我在某个头文件中包含
NTSTATUS PacketDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); 编译就编不过 packet.h(49) : error C2146: syntax error : missing ')' before identifier 'Irp' packet.h(49) : error C2081: 'PIRP' : name in formal parameter list illegal packet.h(49) : error C2061: syntax error : identifier 'Irp' packet.h(49) : error C2059: syntax error : ';' packet.h(50) : error C2059: syntax error : ')' 同样的地方把PIRP改成其他类型如PUINT就没问题,我已经包含了ntddk.h到底是为什么呀,搞了一个早上都没搞好,老大快帮忙 |
|
12楼#
发布于:2004-04-02 09:27
DispatchTable[IRP_MJ_CREATE] = PtDispatch;
DispatchTable[IRP_MJ_CLEANUP] = PtDispatch; DispatchTable[IRP_MJ_CLOSE] = PtDispatch; DispatchTable[IRP_MJ_DEVICE_CONTROL] = PtDispatch; NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); // // Create a device object and register our dispatch handlers // Status = NdisMRegisterDevice( NdisWrapperHandle, &DeviceName, &DeviceLinkUnicodeString, &DispatchTable[0], &ControlDeviceObject, &NdisDeviceHandle ); |
|
13楼#
发布于:2004-04-01 17:51
老大NdisMRegisterDevice的
IN PDRIVER_DISPATCH MajorFunctions[]参数怎么写,拜托了 |
|
14楼#
发布于:2004-03-31 17:55
老大你太伟大了,终于搞定,不过我觉得我写的那个addr.QuadPart=-1;
Status = NdisAllocateMemory(pBuff,2048,0,addr);应该没错 还有问一下那个NdisMRegisterDevice的 IN PDRIVER_DISPATCH MajorFunctions[]参数怎么写,老大帮帮忙 [编辑 - 4/1/04 by aulphar] |
|
15楼#
发布于:2004-03-31 11:17
倒!
PASSTHRU里有的。 #define TAG 'ImPa' PUCHAR pBuffer; NdisAllocateMemoryWithTag(&pBuffer,2048,TAG); ... NdisFreeMemory(pBuffer,2048,0); NdisAllocateMemoryWithTag和NdisAllocateMemory效果是一样的,唯一的区别去看DDK; |
|
16楼#
发布于:2004-03-31 11:04
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。 老大我把pBuff定义成全局变量然后在DriverEntry中执行以下操作分配内存 NDIS_PHYSICAL_ADDRESS addr; addr.QuadPart=-1; Status = NdisAllocateMemory(pBuff,2048,0,addr); 为什么也会重启 |
|
17楼#
发布于:2004-03-30 12:03
使用NdisMoveMemory()操作的一定要都是自己开辟的内存空间,不然就会遇到你碰到的事情。使用NdisMoveMemory()要小心,你必要时候可以把要处理的内容考出来吗。
|
|
|
18楼#
发布于:2004-03-30 09:13
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。 这样他就不是临时变量了,其实只要同在DISPATCH_LEVEL的函数中,临时变量也没问题。但传递0是万万不可的,要杀头的。 |
|
19楼#
发布于:2004-03-29 16:40
老大还有个更大的麻烦我想在PtReceivePacket中做这件事但是他是运行在Dispatch_Level而NdisMoveMemory(tBuffer,BuffVA,BuffLen);的BuffVA是一个零时变量所以NdisMoveMemory必须运行在IRQL < DISPATCH_LEVEL一运行系统就说IRPL_NOT_LESS_OR_EQUAL到底要怎么才能搞定
|
|
上一页
下一页