skyspeed
驱动牛犊
驱动牛犊
  • 注册日期2002-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3658回复:14

请问WinCE上NDIS网卡驱动开发的问题

楼主#
更多 发布于:2002-12-25 15:04
现在开发了一个虚拟的NDIS网卡驱动,下层不控制物理网卡。现在有几个问题,希望与大家讨论:
1、关于加载与卸载
   我希望可以在应用层加载驱动。这样的话应该用DeviceIoControl吧, NDIS网卡驱动的加载是不是都通过DD_NDIS_DEVICE_NAME这个流驱动的ioctl来实现的? 但是我是过几个命令,只有IOCTL_NDIS_LOAD_MINIPORT成功过,其他的像IOCTL_NDIS_REGISTER_ADAPTER都不能成功。我想加载驱动并创建一个网卡实例,到底应该用哪个命令码呢?

2、关于ioctl方法
   我希望在应用层调用驱动里提供的接口,只能用ioctl来实现吧? NDIS网卡驱动模式中,是不是不提供ioctl方法?如果网卡驱动自身又不提供,是不是全得通过DD_NDIS_DEVICE_NAME这个流驱动的ioctl来实现呢? 假如是的话,我如何添加自定义的命令码?不可能要改DD_NDIS_DEVICE_NAME这个流驱动的文件吧,那可是系统文件啊!!!???

欢迎大家讨论! 也许我想的有误,欢迎批评! 不过我的需求是明确的,就是两个\"我希望...\"

最新喜欢:

okincnokincn
blue123
驱动中牛
驱动中牛
  • 注册日期2002-11-09
  • 最后登录2009-09-14
  • 粉丝0
  • 关注0
  • 积分91分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-31 14:57
好象是 activedevice()来加载吧,我也不清楚!!
努力!
91ming
驱动小牛
驱动小牛
  • 注册日期2001-12-03
  • 最后登录2005-06-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-09 12:59
我在CE的帮助中找不到关于activedevice()的文档,烦请告诉我activedevice()函数有什么用?
不断挖掘、开拓希望
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-15 15:56
HANDLE ActivateDevice(
LPCWSTR lpszDevKey,
DWORD dwClientInfo
);
Parameters
lpszDevKey
[in] Pointer to a string that identifies the location under the HKEY_LOCAL_MACHINE registry subtree where the Driver registry subkey for the device resides. A driver registry subkey contains the DLL name, device prefix, friendly name, and other device information.
dwClientInfo
[in] Data to store in the Active registry subkey for the device in the ClientInfo registry entry. The registry path to the Active registry subkey for the device is passed in as the context parameter to the device\'s XXX_Init function. The value in dwClientInfo is stored in the registry, and then the Device Manager calls XXX_Init.
skyspeed
驱动牛犊
驱动牛犊
  • 注册日期2002-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-15 16:05
Hello, bbs_000
你说的这种方法能加载NDIS网卡驱动吗?
有没有例子?
thanks
sbbbbs2003
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2003-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-17 10:43
skyspeed,我也在做这样的项目,希望和你讨论一下。
你做的这个是直接在evc里做的呢还是在vc下做的呢?还是在vc里做好移植过去的?在vc里的所有ndis函数在evc里都支持吗?换言之,是否在evc里可以象在vc里做一样的ndis开发?
skyspeed
驱动牛犊
驱动牛犊
  • 注册日期2002-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-17 10:49
Hi, sbbbbs2003
我是直接在evc里开发的, 现在的问题是驱动好做,但不知如何
动态加载, 不知道怎么用啊?
你找到这方面的信息了吗?

sbbbbs2003
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2003-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-17 11:03
你是否是完全按照在vc下做的那样开发的?比如通过修改passthru?可否发给我一份代码看看?sbbbbs2003@163.com

据我所知,的确是通过ioctl加载的,好像本网站上有。
sbbbbs2003
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2003-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-17 11:03
skyspeed,你是否是完全按照在vc下做的那样开发的?比如通过修改passthru?可否发给我一份代码看看?sbbbbs2003@163.com

据我所知,的确是通过ioctl加载的,好像本网站上有。
skyspeed
驱动牛犊
驱动牛犊
  • 注册日期2002-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-17 11:07
我没有在VC下做过, 你要看我的驱动源码吗, 我是照着ne2000的源码做的,你如果要我可以把ne2000的源码给你。

不过加载的问题我没见到这有啊!
sbbbbs2003
驱动牛犊
驱动牛犊
  • 注册日期2003-01-15
  • 最后登录2003-01-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-01-17 11:19
好啊,你把ne2000源吗发给我吧,谢谢了!

看看下面的文章对你是否有用?

加载一个驱动程序,主要就是,在
SYSTEMCurrentControlSetServices 建一个键。
如:
SYSTEMCurrentControlSetServicesTwdm1
Type(1)
ErrorControl(0)
Start(3)

多数驱动程序都是通过设置 Start 的值为 0, 1, 2 。
在系统启动的过程中加载驱动程序。

在 win2k 下驱动程序的加载处理上述方式外,
还可以在应用程序里用 Service Api 实现,驱动程序的动态加载。
这时候的 Start 为 3 。

所用到的 Api 为:
OpenSCManager, CreateService, OpenService, StartService
ControlService, DeleteService, CloseServiceHandle

其中需要说明的是:
CreateService :他通过参数在注册表里自动创建驱动程序需要的键值。
DeleteService :他自动删除驱动程序在注册表里创的键值。

下面是一个,简单的例子:

应用程序:

#include \"stdafx.h\"
#include <windows.h>
#include <winsvc.h>
#include <conio.h>

void DelSvr( char * szSvrName ); //自动卸载驱动程序。

int main(int argc, char* argv[])
{
HANDLE hWdm;
printf(\"Hello World!n\");

SC_HANDLE hServiceMgr, hServiceTwdm;
BOOL bRtn;
DWORD dwRtn, dwSize = 256;
char szDir[256];

if( argc > 1 ) //加任一个参数表示卸载驱动程序。
{
DelSvr( \"Twdm1\" );
return 0;
}

GetCurrentDirectory( dwSize, szDir );//取当前目录
strcat( szDir, \"\\Twdm.sys\" ); //取驱动程序的全路径

LPCTSTR lpszBinaryPathName = TEXT(szDir);
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); //打开服务控制管理器

if( hServiceMgr == NULL )
{
printf( \"OpenSCManager() Faild %d ! n\", GetLastError() );
return 0;
}
else
{
printf( \"OpenSCManager() ok ! n\" );
}

hServiceTwdm = CreateService( hServiceMgr,
TEXT(\"Twdm1\"), //SYSTEMCurrentControlSetServices 驱动程序的在注册表中的名字
TEXT(\"Twdm1\"), // 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值
NULL,
NULL,
NULL,
NULL,
NULL);

if( hServiceTwdm == NULL )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
{
CloseServiceHandle( hServiceMgr );
printf( \"CrateService() Faild %d ! n\", dwRtn );
return 0;
}
else
{
printf( \"CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! n\" );
}

// 驱动程序已经加载,只需要打开
hServiceTwdm = OpenService( hServiceMgr, TEXT(\"Twdm1\"), SERVICE_ALL_ACCESS );
if( hServiceTwdm == NULL )
{
dwRtn = GetLastError();
CloseServiceHandle( hServiceMgr );
printf( \"OpenService() Faild %d ! n\", dwRtn );
return 0;
}
else
{
printf( \"OpenService() ok ! n\" );
}
}
else
{
printf( \"CrateService() ok ! n\" );
}

// 启动驱动程序,调用驱动程序的 DriverEntry 函数
bRtn = StartService( hServiceTwdm, NULL, NULL );
if( !bRtn )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
{
printf( \"StartService() Faild %d ! n\", dwRtn );
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
return 0;
}
else
{
if( dwRtn != ERROR_IO_PENDING )
{
printf( \"StartService() Faild ERROR_IO_PENDING ! n\");
}
else
{
printf( \"StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! n\");
}
}
}

//测试驱动程序
hWdm = CreateFile(\"\\\\.\\Twdm1\",
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if( hWdm != INVALID_HANDLE_VALUE )
{
printf( \"Open Driver Twdm ok ! n\" );
}
else
{
printf( \"Open Driver Twdm faild %d ! n\", GetLastError() );
}
CloseHandle( hWdm );
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );

//这时候你可以通过注册表,或其他查看符号连接的软件验证。
printf( \"按任意键 卸载驱动程序 !n\" );
getch();
//卸载驱动程序。
DelSvr( \"Twdm1\" );
return 0;
}

//卸载驱动程序。
void DelSvr( char * szSvrName )
{
SC_HANDLE hServiceMgr, hServiceTwdm;
SERVICE_STATUS SvrSta;
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hServiceMgr == NULL )
{
printf( \"DelSvr::OpenSCManager() Faild %d ! n\", GetLastError() );
return;
}
else
{
printf( \"DelSvr::OpenSCManager() ok ! n\" );
}
hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );

if( hServiceTwdm == NULL )
{
CloseServiceHandle( hServiceMgr );
printf( \"DelSvr::OpenService() Faild %d ! n\", GetLastError() );
return;
}
else
{
printf( \"DelSvr::OpenService() ok ! n\" );
}
//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
if( !ControlService( hServiceTwdm, SERVICE_CONTROL_STOP , &SvrSta ) )
{
printf( \"DelSvr::ControlService() Faild %d !n\", GetLastError() );
}
else
{
printf( \"DelSvr::ControlService() ok !n\" );
}
//动态卸载驱动程序。
if( !DeleteService( hServiceTwdm ) )
{
printf( \"DelSvr:eleteSrevice() Faild %d !n\", GetLastError() );
}
else
{
printf( \"DelSvr:eleteSrevice() ok !n\" );
}
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
return;
}

skyspeed
驱动牛犊
驱动牛犊
  • 注册日期2002-12-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-01-17 14:12
有讲WinCE上的网卡加载的类似的文章吗?
附件名称/大小 下载次数 最后更新
2003-01-17_ne2000.rar (50KB)  16
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-01-21 11:06
哥们,对底层(和硬件打交道)驱动程序开发熟悉不?
silan
驱动小牛
驱动小牛
  • 注册日期2002-02-04
  • 最后登录2004-03-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-02-07 15:33
我想问一个问题,像NE2000, RTL8139以太网卡都有支持WindowsCE的驱动程序,这些驱动程序用在哪些设备上啊,WindowCE不是主要用在PDA,工业控制器,信息家电上面吗,这些设备要用到NE2000, RTL8139以太网卡岂不是要集成PCI总线?为以太网卡编写WindowsCE驱动程序是不是有点多余啊?谢谢!!!
/***************************/ 认认真真学好三个代表,踏踏实实做好无产阶级接班人。 /***************************/
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-02-24 18:31
我没有作过硬件,不过好象不多余呀。在WinCE中的NDIS中就有对以太的支持,怎么会多余呢?我也不知道为什么,但肯定不多余了。
我想知道在WinCE中NDIS IMD是不是和Win2K一样的安装方法(主要是注册表的操作),如果不是,哪儿有资料吗?我写完了,可是不知道怎么装载同时还不知道怎么在没有PB的情况下调试。望大侠指教!
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
游客

返回顶部