zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:3511回复:27

pc模拟环境下是否可以通过ActiveDeviceEx加载驱动?

楼主#
更多 发布于:2004-12-02 13:34
我已经把注册表和驱动DLL的接口全部准备好了,可是调用ActiveDeviceEx就是不成功
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-02 14:02
你看看你的注册表设置和驱动输出的接口对不对,也就是.def的函数和注册表的prefix一致不,另外如果有中间层(你的驱动和上层某个库链接),你的prefix要和中间层的接口名字一致。

更直接的检查是看看getlasterror或输出错误信息
根据地的兄弟们,团结就是力量
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-02 15:34
to wxl_50685330:

我是用EVC生成的动态连接库,注册表和函数接口的都对应了,动态连接库主要为了试验,很简单几乎没有任何实际的操作,但所有必须具备的函数都有,如下,注册表里prefix是TST。
    TST_Init
    TST_Deinit
    TST_Open
    TST_Close
    TST_Read
    TST_Write
    TST_Seek
    TST_IOControl
    TST_PowerUp
    TST_PowerDown

看了wxl_50685330的回复,我才发现,我这个EVC生成的DLL工程没有def文件,不只为何?
然后自己做了一个,把内容添上去,编译,还是加载不上  :(

我在DLL的DLLMain和上述函数中都添加了打印信息,发现根本连DLLmain都没有进入!

困扰了还几天了,还是没有解决,帮帮忙把。本人感激涕零
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-03 11:11
你这个动态链接库是在哪里加载的啊?是由你的mdd自动加载的吗?是通过哪个函数加载的?
Come on, let us drive the world.
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-03 12:43
用自己的应用程序加载, 在应用程序里调用ActivateDeviceEx()
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-03 13:35
没有进入dllmain说明你的动态连接库还没有被加载,这之前阻止dll加载的判断全部和注册表相关,你要仔细设置注册表项,有些项不对会马上返回,activatedevice就没机会调用RegisterDevice了

注意事项是:

注册表位置要配对,也就是给activatedevice的参数(注册表项)一定要存在,比如HKEY_LOCAL_MACHINE\\Drivers\\xxx\\yyy

flag要么不设,要么设成0

给出dll名字名字,“dll"="xxx.dll”

index可以不设,设了不要大于9

你再试试,最起码把dll加载上再说
根据地的兄弟们,团结就是力量
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-03 15:46
wxl_50685330大哥,我也有问题要问:
本来呢,我通过在Builtin中增加我的驱动的注册表项可以在CE启动时由设备管理程序加载。
我现在想试试在应用中由ActivateDeviceEx函数来加载我的驱动。我把我的驱动的注册表项原封不动的放到了另外一个位置如:
HKEY_LOCAL_MACHINE\Drivers\xxx\yyy
:)
我在应用中直接调用ActivateDeviceEx(key,NULL,0,NULL);这里key的值即为HKEY_LOCAL_MACHINE\Drivers\xxx\yyy。结果是虽然返回值为0,但是根本没有进入我的驱动的Dllmain中。何故? :mad:
Come on, let us drive the world.
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-06 12:46
GetLastError返回什么?我有时间试试看:)
根据地的兄弟们,团结就是力量
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-07 07:52
谢谢wxl_50685330
这两天又忙别的事情了,一直没有试,等有进一步的结果我再请教。
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-09 10:19
to wwei_wang: 不知你成功没有,如果成功是什么原因呀?我的ActivatedeviceEx还是不行.

to wxl_50685330:

我现在不用模拟环境了,用一个工控主板加wince,evc装了该主板的sdk,重复以前的工作,编写dll,修改注册表,应用程序调用ActivateDeviceEx, 发现dll还是没有加载,苦闷呀。现在把所有的程序贴出来,wxl_50685330一定帮我看看。

def文件:

LIBRARY  drvdll

EXPORTS
    TST_Init
    TST_Deinit
    TST_Open
    TST_Close
    TST_Read
    TST_Write
    TST_Seek
    TST_IOControl
    TST_PowerUp
    TST_PowerDown


dll的cpp文件:

#include "stdafx.h"
typedef class CDriverContext * PDriverContext, * HDRIVER;
typedef struct _tag_OPENHANDLE
{
    HDRIVER hDriver;
} OPENHANDLE, *POPENHANDLE;
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved)
{
    RETAILMSG(1, (TEXT("enter dllmain")));
    return TRUE;
}
BOOL
TST_Init( PCTSTR pszActiveKey )
{
    RETAILMSG(1, (TEXT("enter init")));
    return TRUE;
}
BOOL
TST_Deinit(  )
{
    return TRUE;
}
VOID
TST_PowerUp(HDRIVER pDriver)
{
 
}
VOID
TST_PowerDown( HDRIVER pDriver )
{
 
}
POPENHANDLE
TST_Open(
    HDRIVER pDriver,
    DWORD dwAccess,
    DWORD dwShareMode
    )
{
    return NULL;
}
 BOOL
TST_Close( POPENHANDLE pOpenHandle )
{
    return TRUE;
}

 DWORD
TST_Read(
    POPENHANDLE pOpenHandle,
    LPVOID pBuf,
    DWORD Len
    )
{
    return 0;
}
 DWORD
TST_Write(
    POPENHANDLE pOpenHandle,
    LPCVOID pBuf,
    DWORD Len
    )
{  
    return 0;
}
 DWORD
TST_Seek(
    POPENHANDLE pOpenHandle,
    long pos,
    DWORD type
    )
{
    return (DWORD)-1;
}
 BOOL
TST_IOControl(
    POPENHANDLE pOpenHandle,
    DWORD  dwCode,
    PVOID pBufIn,
    DWORD  dwLenIn,
    PDWORD  pdwBufOut,
    DWORD  dwLenOut,
    PDWORD pdwActualOut
    )
{
  return TRUE;
}

修改注册表程序:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow)
{
HKEY hKey;
LPDWORD p = 0 ;
TCHAR ch[] = TEXT("Drivers\MyDriver\JD45");
LONG rc = RegCreateKeyEx(HKEY_LOCAL_MACHINE, ch, 0, NULL,
0, NULL,
NULL, &hKey,
p);
if(rc != ERROR_SUCCESS)
{
RegCloseKey (hKey);
}

TCHAR Dllname[] = TEXT("drvdll.dll");
rc = RegSetValueEx(hKey, TEXT("Dll"),
0,
           REG_SZ,
(PBYTE)Dllname,
(lstrlen (Dllname)+1) * sizeof(TCHAR));

TCHAR Prefix[] = TEXT("TST");
rc = RegSetValueEx(hKey,  TEXT("Prefix"),  0,
             REG_SZ,  (PBYTE)Prefix,  (lstrlen (Prefix)+1) * sizeof (TCHAR));

DWORD index = 0;
rc = RegSetValueEx(hKey,  TEXT("Index"),  0,
 REG_DWORD,
 (PBYTE)&index,  4);

DWORD order = 1;
rc = RegSetValueEx(hKey,
TEXT("Order"),
0,
REG_DWORD,
(PBYTE)&order, 4);
RegCloseKey (hKey);
return 0;
}

加载驱动程序:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR    lpCmdLine, int       nCmdShow)
{
LPCWSTR  ptr= "HKEY_LOCAL_MACHINE\Drivers\MyDriver\JD45";
DWORD m;
HANDLE hDev = ActivateDeviceEx(ptr, NULL, 0, NULL);
m = GetLastError();
RETAILMSG(1, (TEXT("ActivateDevice code = %drn")),m);
return 0;
}

将dll下载到目标板,运行修改注册表的程序,发现注册表已经改变,运行加载程序,发现hDev仍然是0,看到到打印出来的错误码是59。不知道哪里除了问题。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-09 14:04
我试试哈

1.你的drvdll.dll放到什么地方的?试试放到\\windows下

2.LPCWSTR ptr= TEXT("HKEY_LOCAL_MACHINE\\Drivers\\MyDriverJD45");

3..def里面LIBRARY drvdll写成LIBRARY STRATAD

4.在注册表设"Flags"=dword:00000002

再试试呢
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-09 14:05
2.LPCWSTR ptr= TEXT("HKEY_LOCAL_MACHINE\\\\Drivers\\\\MyDriverJD45");
根据地的兄弟们,团结就是力量
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-09 14:28
我的程序里本来是:LPCWSTR ptr= TEXT("HKEY_LOCAL_MACHINE\\Drivers\\MyDriver\\JD45");拷贝的时候掉了\\

我在注册表里添加了Flag 设为2

可是还是不行,返回仍然是0



zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-09 14:30
.def里面LIBRARY drvdll 也改成LIBRARY STRATAD

 :(
55555
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-09 15:58
哈哈哈哈,不是吧,还是不行?是不是非要我亲自动手麻:)))

对了,是两个\\喔,实在不行...
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-12-09 16:01
能重新链接os不?再试试把dll放到bib的modules里面呢
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-12-09 16:07
等等,我好像知道了!!!!


LPCWSTR ptr= TEXT("Drivers\\\\MyDriver\\\\JD45")
根据地的兄弟们,团结就是力量
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-12-09 16:18
wxl_50685330
你真神了,太谢谢你了,我终于加载成功了,感激涕零
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-09 16:20
就是ptr的问题,不该加HKEY_LOCAL_MACHINE,
的确应该是LPCWSTR ptr= TEXT("Drivers\\MyDriver\\JD45")

 :)
zhuyanjv
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2008-02-19
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望8点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-09 16:59
hehe,还几个事情不太清楚,想请教wxl_50685330:
1:应用程序调用ACtivateDeviceEx时,驱动里的XXX_Init应该被调用吧,可是我发现我在Init里的打印信息并没有输出, DLLMain里信息的也没有输出, 但是注册表里的Active键已经添加了我的驱动的信息。
2:我用设备名 TST0: 打开设备的时候,返回的句柄无效,错误代码时55,设备不存在, 这是为何?
上一页
游客

返回顶部