zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1420回复:14

老大,看看这个问题,救救我吧,VXD加载方面的奇怪问题

楼主#
更多 发布于:2002-08-04 20:11
我的程序在测试模块中用的自编的定时器VXD(COMS定时器中断,精度为1ms),当进行报表打印后,再进入测试模块,就会出现VXD加载不上,如果不进行打印,只进行预览,其它操作都不会有问题,那位老大指点一下啊

ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 0,0,0,CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0);
if (ghDevice == INVALID_HANDLE_VALUE) {
::MessageBox(hWnd, \"定时器VxD加载失败,请重新打开程序.\", \"系统消息\", MB_OK);
pView->Reset();
return 0;
}
if (!DeviceIoControl(ghDevice, ADDRESSPASS, CallBackAPC, 0, 0, 0, 0, 0)) {
::MessageBox(hWnd, \"定时器VxD调用失败,请重新打开程序.\", \"系统消息\", MB_OK);
return 0;
}
zhouwj
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-08-05 11:17
说的不够清楚,不好理解。
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-05 21:46
大佬,你好
我做的是一个测试系统,自己做了一个精度为1ms的定时器,做为定时触发采集,VXD程序是参照本站首页上一篇文章:
//Windows 9X硬件中断设备驱动程序的开发
//作者: 姜山 程君实
现在出现这样一个问题,就是在我的程序里打印报表后,再重新进入进行测试时,会出现加载VXD失败,如果打印后退出程序,再重新进入,或只进行打印预览操作,再进行测试(再次加载VXD)都不会有问题的。

我想:
这是不是打印驱动和我编的VXD有冲突?
在什么情况下会出现VXD加载不成功?
请指教。
zhouwj
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-08-06 08:44
就是说用createfile打开vxd出错?error code是?
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-06 13:16
是啊 ,CreateFile(vxd)时返回 error code 为 INVALID_HANDLE_VALUE,奇怪的是不进行打印操作的话,就不会有问题,包括打印预览,看来不会是我打印模块的问题,是不是打印驱程和我的定时器VXD有冲突? 在VXD中我设的Device ID为 UNDEFINED_DEVICE_ID,这有没有问题呢
zhouwj
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-08-06 15:41
和deviceID没有关系的。
把你的createfile相关的代码贴上来看看?
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-06 18:17
//装载定时VXD
UINT LoadTimer(LPVOID pParam)
{
CMainFrame* pMainwnd = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CMotorTestView02* pView = (CMotorTestView02*)pMainwnd->GetActiveView();
ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 0,0,0,CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0);
if (ghDevice == INVALID_HANDLE_VALUE)
{
    ::MessageBox(hWnd, \"定时器VxD加载失败,请重新打开程
                       序.\", \"系统消息\", MB_OK);
     pView->Reset();
     return 0;
}
if (!DeviceIoControl(ghDevice, ADDRESSPASS, CallBackAPC, 0, 0, 0, 0, 0))
{
    ::MessageBox(hWnd, \"定时器VxD调用失败,请重新打开程
                       序.\", \"系统消息\", MB_OK);
     return 0;
}

while(TRUE){
    if(bEndThread)break;
    SleepEx(INFINITE, TRUE);
}
::AfxEndThread(0);
return 0;
}
zhouwj
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-06 18:21
void CMotorTestView02::OnInitialUpdate()
{
...........
Thread3 = AfxBeginThread(LoadTimer, NULL,
 D_PRIORITY_NORMAL,0, CREATE_SUSPENDED);
...........
}


//测试过程中
.......
//启动测试线程
//恢复线程
if(!bThread2){
Thread2->ResumeThread();
bThread2 = TRUE;
}
if(!bThread3){
Thread3->ResumeThread();
bThread3 = TRUE;
}
.......
zhouwj
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-06 21:29
#define DEVICE_MAIN
#include \"irqtimer.h\"
#include \"Event.h\"

Declare_Virtual_Device(IRQTIMER)
#undef DEVICE_MAIN

MyHwInt* pMyIRQ;
PVOID CallBackApc = 0;
THREADHANDLE TheThread = 0;
int x = 0, y = 0;
unsigned char b;

IrqtimerVM::IrqtimerVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}
IrqtimerThread::IrqtimerThread(THREADHANDLE hThread) : VThread(hThread) {}

//中断服务程序
VOID MyHwInt::OnHardwareInt(VMHANDLE)
{
_outp(0x70, 0xc);
_inp(0x71); //清除中断标志
x++;
if(x >= 5){//1秒
x = 0;
y++;
VWIN32_QueueUserApc(CallBackApc, (DWORD)&y, TheThread);
//用指定线程和返回值调用WIN32应用程序
//(DWORD)&x异步传给RING3程序的参数
//RING0线程句柄

//VSD_Bell();
//发声500ms
dout<<\"aaaa\"<<endl;
}
sendPhysicalEOI(); //通知VPICD结束中断处理
//VPICD:virtual Programmable Interrupt Controller Device
}

BOOL IrqtimerDevice::OnSysDynamicDeviceInit()
{
dout<<\"//动态打开设备\"<<endl;
pMyIRQ = new MyHwInt();
if (!pMyIRQ || !pMyIRQ->hook()) return FALSE;
_outp(0x70,0xb);
b =_inp(0x71);      //保存寄存器B初始值
_outp(0x70,0xb);
_outp(0x71,0x40 | b);
pMyIRQ->physicalUnmask();
return TRUE;
}

BOOL IrqtimerDevice::OnSysDynamicDeviceExit()
{
dout<<\"////动态关闭设备\"<<endl;
_outp(0x70,0xb);
_outp(0x71,b);     //禁止周期中断,恢复寄存器B初值
if (pMyIRQ) delete pMyIRQ;
return TRUE;
}

DWORD IrqtimerDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
switch(pDIOCParams->dioc_IOCtlCode)
{
case DIOC_OPEN:{//动态打开设备//用CreateFile方式
dout<<\"动态打开设备\"<<endl;
break;
}

case DIOC_CLOSEHANDLE:{//动态关闭设备//用CloseHandle方式
dout<<\"动态关闭设备\"<<endl;
break;
}

case hEventPASS:{
dout<<\"hEventPASS\"<<endl;
CallBackApc = pDIOCParams->dioc_InBuf;
TheThread = Get_Cur_Thread_Handle();
break;
}

case READ:{
dout<<\"READ\"<<endl;
break;
}

default:return -1;
}
return 0;
}
zhouwj
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-08-07 00:11
please print out the value of GetLastError.

any reason for a fail open will get a return value of INVALID_HANDLE_VALUE.


and...
hen create vxd as devcie, people commonly use
 SysHandle = CreateFile( VXD_FILE, 0, 0, NULL ,
0,
FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE,
NULL );


and also, does not use vxdfilename like
\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD

why add IRQTIMER\\\\  ???
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-08-07 09:10
是ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\", 0,0,0,CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0);这句返回错误了吗?GetLastError是什么?
改成ghDevice = CreateFile(\"\\\\\\\\.\\\\IRQTIMER.VXD\", 0,0,0,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0);
将irqtimer.vxd copy到system目录,再看看?

zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-08 01:14
谢谢两位老大的指点,我去试试看,希望能找到原因,解决问题。
zhouwj
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-08 18:28

问题解决了!   :)


= CreateFile(\"\\\\\\\\.\\\\IRQTIMER\\\\IRQTIMER.VXD\",

= CreateFile(\"\\\\\\\\.\\\\IRQTIMER.VXD\",  

把IRQTIMER.VXD复制到   windows\\system\\.也可以

谢谢两位老大,可解决大问题了,我的系统终于验收通过了.
zhouwj
zhouwj
驱动牛犊
驱动牛犊
  • 注册日期2001-08-15
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-08-08 18:33
不好意思,我是新手上路,分不多,请消纳。 :)
zhouwj
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
14楼#
发布于:2002-08-08 19:10
呵呵,恭喜。
游客

返回顶部