aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3438回复:33

中间层接受数据的问题请指教

楼主#
更多 发布于:2004-03-23 16:06
1.PtReceive和PtReceivePacket分别会在什么情况下调用,ddk上说的实在没看懂
2.为什么我试xpassthru总是进不去PtReceive但却可以进PtReceiveComplete
3.ptreceivepacket或MPReturnPacket中没有如ptreceive 中的LookAheadBuffer那我要拿packet的数据该怎么办

最新喜欢:

zhaihuazhaihu...
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-06 09:10
老大我在mphalt的最后写NDISMDregisterDevice居然说NDIS.sys有IRPlevel错误,到底应该在什么地方做,现在我那个驱动卸载不了,我只好重装系统了,老大快来帮忙
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-04 16:37
我放在NDISIMRegisterLayeredMiniport之后就可以了,能不能解释一下是为什么,还有我应该在什么时候调用NdisMDeregisterDevice
到底是halt还是unload,还是无所谓
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-04 16:05
我写的是两斜线,还是不行返回的结果是NDIS_STATUS_NOT_SUPPORTED按照DDK的说法是调用者不是MINIPORT我这个是中间层,当然不是MINIPORT,那到底要怎么样才行
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-02 17:56
靠!
我明明改了吗,怎么一发就变了。
你把一个反斜杠,该为两个反斜杠
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-02 17:54
sorry
#define NT_DEVICE_NAME L"\\Device\\MPassthru"
#define DOS_DEVICE_NAME L"\\DosDevices\\MPassthru"





 
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-02 17:48
老大是不是写错了,你写的更我前两行完全一样
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-02 17:40
应该是
#define NT_DEVICE_NAME L"\\Device\\MPassthru"
#define DOS_DEVICE_NAME L"\\DosDevices\\MPassthru"


aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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带出来的
结果是不成功,帮我看看吧
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-02 16:05
#define MINIPORT_WDM 1
或则
#define NDIS_WDM 1

#define BINARY_COMPATIBLE 0

prexsim.h
具体我记不请了。
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-02 16:03
上面问题还没解决,
还有老大IN PDRIVER_DISPATCH MajorFunctions[]
不是把DriverObject->MajorFunction传进去而是自己定义
PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION+1];
然后往里面传呀
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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到底是为什么呀,搞了一个早上都没搞好,老大快帮忙
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
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
                    );
 
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-01 17:51
老大NdisMRegisterDevice的
IN PDRIVER_DISPATCH MajorFunctions[]参数怎么写,拜托了
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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]
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-03-31 11:17
倒!
PASSTHRU里有的。
#define TAG 'ImPa'
PUCHAR pBuffer;
NdisAllocateMemoryWithTag(&pBuffer,2048,TAG);
...
NdisFreeMemory(pBuffer,2048,0);
NdisAllocateMemoryWithTag和NdisAllocateMemory效果是一样的,唯一的区别去看DDK;

aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-03-31 11:04
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。

老大我把pBuff定义成全局变量然后在DriverEntry中执行以下操作分配内存
NDIS_PHYSICAL_ADDRESS           addr;
addr.QuadPart=-1;
Status = NdisAllocateMemory(pBuff,2048,0,addr);
为什么也会重启
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-03-30 12:03
使用NdisMoveMemory()操作的一定要都是自己开辟的内存空间,不然就会遇到你碰到的事情。使用NdisMoveMemory()要小心,你必要时候可以把要处理的内容考出来吗。
我是来学习的。不打扫卫生
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-03-30 09:13
用NdisAllocateMemory();或者,ExAllocatePool()来分配非分页内存。

这样他就不是临时变量了,其实只要同在DISPATCH_LEVEL的函数中,临时变量也没问题。但传递0是万万不可的,要杀头的。
aulphar
驱动牛犊
驱动牛犊
  • 注册日期2004-02-23
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-03-29 16:40
老大还有个更大的麻烦我想在PtReceivePacket中做这件事但是他是运行在Dispatch_Level而NdisMoveMemory(tBuffer,BuffVA,BuffLen);的BuffVA是一个零时变量所以NdisMoveMemory必须运行在IRQL < DISPATCH_LEVEL一运行系统就说IRPL_NOT_LESS_OR_EQUAL到底要怎么才能搞定
上一页
游客

返回顶部