wince6.0下DM9000驱动里增加powerdown关机后省电模式的代码怎么没被执行?

zhengmeifu 2011-05-19 04:14:28
/********************************************************************************************
*
* DriverEntry
*
********************************************************************************************/

extern "C" NTSTATUS DriverEntry(
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
NDIS_STATUS status;
NDIS_HANDLE hwrapper;
// NDIS40_MINIPORT_CHARACTERISTICS ndischar;
NDIS51_MINIPORT_CHARACTERISTICS DM9000Char; /* add by ZMF */

RETAILMSG(1,(TEXT("[dm9]:[CUSTOM_BOARD_STR]\r\n")));
RETAILMSG(1,(TEXT("[dm9] NewOBJ-2009 \r\n")));
NKDbgPrintfW(TEXT("[dm9] NewOBJ-2009 %s \r\n"), DRIVER_VERSION);
NKDbgPrintfW(TEXT("[dm9] NewOBJ-2009 %s \r\n"), CUSTOM_BOARD_STR);

PUTS(("[dm9] <NDIS40_MINIPORT Driver>\r\n")); //PUTS(("<Davicom DM9000/9000A/9010 driver v2.08_n_later for WinCE 4.2/5.0/6.0>\r\n"));

NdisMInitializeWrapper(
&hwrapper,
pDriverObject,
pRegistryPath,
NULL);

memset((void*)&DM9000Char,0,sizeof(DM9000Char));
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.MajorNdisVersion = PRJ_NDIS_MAJOR_VERSION;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.MinorNdisVersion = PRJ_NDIS_MINOR_VERSION;

DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.InitializeHandler = MiniportInitialize;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.ResetHandler = MiniportReset;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.CheckForHangHandler = MiniportCheckForHang;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.HaltHandler = MiniportHalt;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.HandleInterruptHandler = MiniportInterruptHandler;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.ISRHandler = MiniportISRHandler;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.QueryInformationHandler = MiniportQueryInformation;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.SetInformationHandler = MiniportSetInformation;
DM9000Char.Ndis50Chars.Ndis40Chars.Ndis30Chars.SendHandler = MiniportSend;
// ndischar.Ndis30Chars.DisableInterruptHandler =MiniportDisableInterrupt;
// ndischar.Ndis30Chars.EnableInterruptHandler=MiniportEnableInterrupt;
DM9000Char.AdapterShutdownHandler=MiniportHalt; 这个函数里就是关机后想要被执行的函数。这个函数定义在下面。
if((status = NdisMRegisterMiniport(
hwrapper,
(PNDIS_MINIPORT_CHARACTERISTICS)&DM9000Char,
sizeof(DM9000Char)) != NDIS_STATUS_SUCCESS))
{
NdisTerminateWrapper(hwrapper,NULL);
return status;
}

#ifndef IMPL_DLL_ENTRY
INIT_EXCEPTION();
#endif

return NDIS_STATUS_SUCCESS;

}
上面说的MiniportHalt的定义:
VOID MiniportHalt(
IN NDIS_HANDLE MiniportContext)
{
((NIC_DRIVER_OBJECT*)MiniportContext)->DriverHalt();
}
DriverHalt定义如下:/* ADD BY ZMF FOR PM */
void C_DM9000::DeviceHalt(void)
{

NKDbgPrintfW(TEXT("[dm9]ZMF: DeviceHalt:[dm9] -- \r\n"));

DeviceWritePort(DM9_GPR, 0x01);
DeviceWritePort(DM9_NCR, 0xB800);
DeviceWritePort(DM9_SCTCR,0x01);
// announce shutdown
m_bShutdown = 1;
DeviceDisableInterrupt();
ID_CUSTOM_INT_DIS

}
/* ADD BY ZMF FOR PM */
问题是怎么关机后没有被执行?我在注册表里也增加了ICLASS,如下:

[HKEY_LOCAL_MACHINE\Comm\DM9000]
"DisplayName"="DM9000 Fast Ethernet Adapter"
"Group"="NDIS"
"ImagePath"="DM9000.dll"
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; Power-manageable generic ADD BY ZMF

[HKEY_LOCAL_MACHINE\Comm\DM9000\Linkage]
"Route"=multi_sz:"DM9000"

[HKEY_LOCAL_MACHINE\Comm\DM9000\Parms]
"BusNumber"=dword:0
"BusType"=dword:0

[HKEY_LOCAL_MACHINE\Comm\DM9000\Parms\TcpIp]
"EnableDHCP"=dword:1
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\Suspend\{A32942B7-920C-486b-B0E6-92A702A99B35}]
"Default"=dword:4 ; D3
哪位大侠能指导一下?跪谢!
...全文
399 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengmeifu 2011-07-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kj852284877 的回复:]
联系我 给给你解决 QQ1667698625
[/Quote]
你是销售人员吧?没法解决吧?都这么久了没音信。
zhengmeifu 2011-05-31
  • 打赏
  • 举报
回复
自己顶一下,网友们,谁做过网卡的休眠和唤醒呀?指导一二呀。
fqayst 2011-05-31
  • 打赏
  • 举报
回复
dm9000的wince驱动不是流驱动,休眠的时候好像就不会调用powerdown函数,流驱动休眠的时候是会调用powerdown函数的。网卡的休眠和唤醒,最近我也在弄,不过也没什么进展。
zhengmeifu 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fqayst 的回复:]
DM9000的注册表里面加入电源管理的IClass键值
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; Power-manageable generic
试试。
[/Quote]
有加呀,兄弟。可能是我不懂NDIS的工作机制呀。谢谢!
fqayst 2011-05-23
  • 打赏
  • 举报
回复
DM9000的注册表里面加入电源管理的IClass键值
"IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}" ; Power-manageable generic
试试。
zhengmeifu 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 billyhe1983 的回复:]
DM9000没做过这个,但不管哪个设备,首先要确定的是,该设备是否支持休眠/唤醒功能
[/Quote]
要怎么确定呢?我看dm9000这个驱动是支持电源管理的,因为有DM9000Char.AdapterShutdownHandler这个结构体的域。我只要把这个shutdownHandler函数告诉它就行了。
用心飞翔 2011-05-20
  • 打赏
  • 举报
回复
DM9000没做过这个,但不管哪个设备,首先要确定的是,该设备是否支持休眠/唤醒功能
鼎拨神器 4.02 软件描述 ====================== 一、软件简介 鼎拨神器是一款面向拨号场景的桌面工具软件,提供账号批量拨号、拨号状态管理、日志留痕等功能,适用于需要频繁切换拨号账号的使用场景。软件界面简洁、操作直观,账号配置与管理一体化,开箱即用。 二、核心功能 1. 账号拨号:支持多账号配置,账号与密码以"空格或 Tab 键"分隔,可从表格(一列账号、一列密码)直接复制粘贴导入,批量管理、快速切换。 2. 动态等待:拨号成功后支持 1-60 秒动态等待时长,可有效规避连续拨号过快导致的失败,提升拨号成功率。 3. 流量选项:内置流量模式选项(4.0 版本新增),按需选择,灵活适配不同拨号需求。 4. 日志留痕: - dial_log.xls:最近一次拨号记录; - dial_log_日期.txt:全部拨号记录,按天归档,方便追溯与统计。 5. 图标美化:4.02 版本窗口左上角与任务栏统一应用专属图标,界面更规范。 三、版本更新记录 - 版本 4.02:修复了一些已知问题,优化窗口图标显示。 四、目录结构说明 - 鼎拨神器.exe:主程序,双击启动。 - Launcher_ForExe.exe:拨号调度启动器。 - Program 文件夹:软件内部文件,请勿删除。 - Program\dial.exe:核心拨号组件。 - accounts.txt:账号密码配置文件(账号与密码间用一个空格或 Tab 键隔开)。如不慎删除,请以"accounts.txt"命名自建文件即可恢复使用。 - rz 文件夹:日志文件夹,自动生成拨号记录。 建议每次拨号时将最后一个账号设为自己固有的账号,避免前面所有账号拨号不成功。 详细条款请参阅软件包内《软件使用授权及免责声明》。

19,524

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧