bcb版的弟兄们,版主们,大家进来帮忙,讨论一个较深的问题

jianlinlong 2003-06-23 11:00:31
有一个系统用到硬件卡,在win98有盘上播放一切正常。到无盘(用的是明智无盘系统)上运行后有就时常会出现死机和蓝屏的现象。蓝屏显示该硬件卡的驱动访问某个地址冲突,按任一键后又回到了无盘win98。但是此时该硬件卡的驱动的部分功能已经失效。。。。。。。严重影响了系统的运行.

我现在想,是否能写一个监视程序,它能检测到这个硬件卡, 一但发现有错误,就让系统重新装载。(或者说弄一个程序,凡win98的异常它都能够知道)

现在卡了,要监视硬件驱动,我摸不着门道!
...全文
161 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
dmsun 2003-07-02
  • 打赏
  • 举报
回复
太牛了!ddk玩得很遛!无比崇拜中.......
kingcaiyao 2003-07-02
  • 打赏
  • 举报
回复
楼上的,严重了,只要你多看看书一样可以做到。
gfh_79_0 2003-07-02
  • 打赏
  • 举报
回复
佩服!佩服,
向AKing学习。
jianlinlong 2003-07-02
  • 打赏
  • 举报
回复
这几天忙着把程序重新分析一翻,所以没有再试了(水平还不够呀)。

以后有时间再慢慢来试,真佩服AKing的功力,他是真正的King呀!

再一次谢谢AKing的帮助
「已注销」 2003-06-30
  • 打赏
  • 举报
回复
听课
cnphw 2003-06-26
  • 打赏
  • 举报
回复
晕菜
kingcaiyao 2003-06-26
  • 打赏
  • 举报
回复
我贴出来:
// devintf.h - include file for classes CDeviceInterfaceClass and CDeviceInterface
//=============================================================================
//
// Compuware Corporation
// NuMega Lab
// 9 Townsend West
// Nashua, NH 03060 USA
//
// Copyright (c) 1998 Compuware Corporation. All Rights Reserved.
// Unpublished - rights reserved under the Copyright laws of the
// United States.
//
// U.S. GOVERNMENT RIGHTS-Use, duplication, or disclosure by the
// U.S. Government is subject to restrictions as set forth in
// Compuware Corporation license agreement and as provided in
// DFARS 227.7202-1(a) and 227.7202-3(a) (1995),
// DFARS 252.227-7013(c)(1)(ii)(OCT 1988), FAR 12.212(a) (1995),
// FAR 52.227-19, or FAR 52.227-14 (ALT III), as applicable.
// Compuware Corporation.
//
// This product contains confidential information and trade secrets
// of Compuware Corporation. Use, disclosure, or reproduction is
// prohibited without the prior express written permission of Compuware
// Corporation.
//
//=============================================================================

// This file is for APPLICATIONS, not drivers. It implements two classes:

//
// CDeviceInterfaceClass - this class wraps the call to SetupDiGetClassDevs
// CDeviceInterface - this class wraps the calls to SetupDiEnumDeviceInterfaces and
// SetupDiGetInterfaceDeviceDetail
//

// Here is an example:
/*
static GUID TestGuid =
{ 0x4747be20, 0x62ce, 0x11cf, { 0xd6, 0xa5, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00 } };

HANDLE OpenByInterface(GUID* pClassGuid, DWORD instance, PDWORD pError)
{
CDeviceInterfaceClass DevClass(pClassGuid, pError);

if (*pError != ERROR_SUCCESS)
return INVALID_HANDLE_VALUE;

CDeviceInterface DevInterface(&DevClass, instance, pError);

if (*pError != ERROR_SUCCESS)
return INVALID_HANDLE_VALUE;

cout << "The device path is " << DevInterface.DevicePath() << endl;

HANDLE hDev;

hDev = CreateFile(
DevInterface.DevicePath(),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);

if (hDev == INVALID_HANDLE_VALUE)
*pError = GetLastError();

return hDev;
}
*/


#include <setupapi.h>
#include <tchar.h> // Note UNICODE may not work for Win98??

#define DEVINTF_INLINE inline

//////////////////////////////////////////////////////////////////////////////
// class CDeviceInterfaceClass
//
class CDeviceInterfaceClass
{
public:
CDeviceInterfaceClass(GUID* pClassGuid, PDWORD status);
~CDeviceInterfaceClass(void);
GUID* GetGuid(void) { return &m_Guid; }
HDEVINFO GetHandle(void) { return m_hInfo; }

protected:
HDEVINFO m_hInfo;
GUID m_Guid;
};

//////////////////////////////////////////////////////////////////////////////
// class CDeviceInterface
//
class CDeviceInterface
{
public:
DEVINTF_INLINE CDeviceInterface( CDeviceInterfaceClass* pClassObject, DWORD Index, PDWORD Error );
DEVINTF_INLINE ~CDeviceInterface(void);
DEVINTF_INLINE TCHAR* DevicePath(void);

protected:
CDeviceInterfaceClass* m_Class;
SP_DEVICE_INTERFACE_DATA m_Data;
PSP_INTERFACE_DEVICE_DETAIL_DATA m_Detail;
};


//////////////////////////////////////////////////////////////////////////////
// CDeviceInterfaceClass constructor
//
DEVINTF_INLINE CDeviceInterfaceClass::CDeviceInterfaceClass(
GUID* pClassGuid,
PDWORD status
)
{
DWORD flags = DIGCF_DEVICEINTERFACE | DIGCF_PRESENT ;
m_hInfo = INVALID_HANDLE_VALUE;
ZeroMemory(&m_Guid,sizeof(GUID));

try
{
*status = ERROR_INVALID_PARAMETER;
m_Guid = *pClassGuid;
m_hInfo = SetupDiGetClassDevs(pClassGuid, NULL, NULL, flags);

if ( m_hInfo == INVALID_HANDLE_VALUE )
*status = GetLastError();
else
*status = ERROR_SUCCESS;

}
catch (...)
{
m_hInfo = INVALID_HANDLE_VALUE;
}
}

//////////////////////////////////////////////////////////////////////////////
// CDeviceInterfaceClass destructor
//
DEVINTF_INLINE CDeviceInterfaceClass::~CDeviceInterfaceClass(void)
{
if ( m_hInfo != INVALID_HANDLE_VALUE )
SetupDiDestroyDeviceInfoList(m_hInfo);

m_hInfo = INVALID_HANDLE_VALUE;
}

//////////////////////////////////////////////////////////////////////////////
// CDeviceInterface constructor
//
DEVINTF_INLINE CDeviceInterface::CDeviceInterface(
CDeviceInterfaceClass* pClassObject,
DWORD Index,
PDWORD Error
)
{
m_Class = pClassObject;

BOOL status;
DWORD ReqLen;

m_Detail = NULL;
m_Data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

try
{
*Error = ERROR_INVALID_PARAMETER;

status = SetupDiEnumDeviceInterfaces(
m_Class->GetHandle(),
NULL,
m_Class->GetGuid(),
Index,
&m_Data
);

if ( !status )
{
*Error = GetLastError();
return;
}

SetupDiGetInterfaceDeviceDetail (
m_Class->GetHandle(),
&m_Data,
NULL,
0,
&ReqLen,
NULL
);

*Error = GetLastError();

if ( *Error != ERROR_INSUFFICIENT_BUFFER )
return;

m_Detail = PSP_INTERFACE_DEVICE_DETAIL_DATA(new char[ReqLen]);

if ( !m_Detail )
{
*Error = ERROR_NOT_ENOUGH_MEMORY;
return;
}

m_Detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

status = SetupDiGetInterfaceDeviceDetail (
m_Class->GetHandle(),
&m_Data,
m_Detail,
ReqLen,
&ReqLen,
NULL
);

if ( !status )
{
*Error = GetLastError();
delete m_Detail;
m_Detail = NULL;
return;
}

*Error = ERROR_SUCCESS;
}
catch (...)
{
}
}

//////////////////////////////////////////////////////////////////////////////
// CDeviceInterface destructor
//
DEVINTF_INLINE CDeviceInterface::~CDeviceInterface(void)
{
if (m_Detail)
{
delete m_Detail;
m_Detail = NULL;
}
}

//////////////////////////////////////////////////////////////////////////////
// CDeviceInterface::DevicePath
//
DEVINTF_INLINE TCHAR* CDeviceInterface::DevicePath(void)
{
try
{
if ( m_Detail)
return m_Detail->DevicePath;
else
return NULL;
}
catch (...)
{
return NULL;
}

}


jianlinlong 2003-06-26
  • 打赏
  • 举报
回复
to kingcaiyao(AKing) :

你能不能把包含 CDeviceInterface 的 devintf.h (devintf.*)发到我的邮箱 jianlinlong@163.net ? 你以前写的那段代码我比较容易理解些。

对你的帮助我十分的感谢!
kingcaiyao 2003-06-26
  • 打赏
  • 举报
回复
GUID我知道你不会找错,但你的设备序列号有没有找错???
它位于注册表中:HKEY_LOCAL_MACHINE\CurrentControlSet\Class\你设备的GUID,然后在设备类的下面有若干个子键,0000,0001等,你可以从这些子键中找到你的设备。如果在0000的子键中找到你的设备,那么就表明在你的机器上你的设备在同类设备中的序列号0,依次类推。
kingcaiyao 2003-06-26
  • 打赏
  • 举报
回复
一般与驱动程序通信就是上面的代码,因为我的机器上也没有硬件卡,但我写的这段程序的确可以与我机器上其它设备如:IP Modem(USB口)进行通信,你可以设个断点一步一步调试。
jianlinlong 2003-06-26
  • 打赏
  • 举报
回复
硬件卡的GUID我是找对了,Index我看也没有不对,可是每次都在

/*********每次执行都从这退出****/

那段代码就退出了,难!
jianlinlong 2003-06-26
  • 打赏
  • 举报
回复
看来俺水平对这个东东还是相差太远,麻烦 kingcaiyao(AKing)兄 帮我看看下面的代码错在哪?

void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD ReqLength;
DWORD Flags=DIGCF_PRESENT|DIGCF_DEVICEINTERFACE;
//GUID CardGuid={0000,000,{00,00....}};//你硬件的GUID,可以从驱动程序的安装文件或注册表中找到
GUID CardGuid = StringToGUID("{4d36e96c-e325-2233-bfc1-08002be10318}");
HANDLE hCard=0;//操作硬件卡的句柄
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceDetailData;
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
hCard=SetupDiGetClassDevs(&CardGuid,NULL,NULL,Flags);
if(hCard==INVALID_HANDLE_VALUE)
{
::MessageBox(0,"Invalid Parameters!","Error",MB_OK|MB_ICONERROR);
return;
}

// BOOL status = SetupDiEnumDevice(hCard,NULL,&CardGuid, 19/*Index*/,&DeviceInterfaceData,&ReqLength,
// NULL);//注意这里的Index参数,指的是你的设备序列号
SP_DEVINFO_DATA dev_dat;
SetupDiEnumDeviceInfo(hCard, 19, &dev_dat);
BOOL status = SetupDiEnumDeviceInterfaces(hCard,
//&dev_dat,
NULL,
&CardGuid,
19/*Index*/,
&DeviceInterfaceData
);//注意这里的Index参数,指的是你的设备序列号

if (!status)
{
::MessageBox(0,"Failed to enumurate the specified device!","Error",MB_OK+MB_ICONERROR); /*********每次执行都从这退出****/
::CloseHandle(hCard);
return;
}
SetupDiGetInterfaceDeviceDetail(hCard,&DeviceInterfaceData,NULL,0,&ReqLength,NULL);
DeviceDetailData=(PSP_INTERFACE_DEVICE_DETAIL_DATA)new char[ReqLength];
if(DeviceDetailData)
{
::MessageBox(0, "ERROR NOT ENOUGH MEMORY!","Error",MB_OK+MB_ICONERROR);
::CloseHandle(hCard);
return;
}
status=SetupDiGetInterfaceDeviceDetail(hCard,&DeviceInterfaceData,DeviceDetailData,ReqLength,&ReqLength,NULL);
if(!status)
{
::MessageBox(0,"Failed to get interface detailed data", "Error",MB_OK+MB_ICONERROR);
delete DeviceDetailData;
DeviceDetailData = NULL;
return;
}
ShowMessage(DeviceDetailData->DevicePath);
//DevicePath就是你要得到的参数有了DevicePath就好像有了设备的符号名,比如:COM1,COM2等,这样你就可以用
//CreateFile,ReadFile,WriteFile来和你硬件卡的驱动程序进行通信。有些设备制造商在开发驱动程序时可能就为该设备建立一个符号名,如最常见的\\\\..\\EZUSB等,但根据你所提供的情况,只能通过接口来与它的驱动程序进行通信
}
//---------------------------------------------------------------------------
RomanticProgrammer 2003-06-26
  • 打赏
  • 举报
回复
AKing乃真英雄也。^_^。
tccsdn 2003-06-26
  • 打赏
  • 举报
回复
上面说的硬件卡是什么东西呀
domustdo 2003-06-25
  • 打赏
  • 举报
回复
学习!
jianlinlong 2003-06-25
  • 打赏
  • 举报
回复
在上面的链接错误之前我将 SetupDiEnumDevice 改成:
SP_DEVINFO_DATA dev_dat;
SetupDiEnumDeviceInfo(hCard, 19, &dev_dat);
BOOL status = SetupDiEnumDeviceInterfaces(hCard,
&dev_dat,
&CardGuid,
19/*Index*/,
&DeviceInterfaceData
);//注意这里的Index参数,指的是你的设备序列号

对吗?
jianlinlong 2003-06-25
  • 打赏
  • 举报
回复
巨晕,[Linker Error] 'D:\DOCUMENTS AND SETTINGS\ADMINISTRATOR\桌面\DRV_CONTROL\SETUPAPI.LIB' contains invalid OMF record, type 0x21 (possibly COFF)

用Borland自带的coff2omf转换也不成功:

d:\>coff2omf f:\setupapi.lib f:\ok.lib
COFF to OMF Converter Version 1.0.0.74 Copyright (c) 1999, 2000 Inprise Corporat
ion
ERROR: Cannot rename coffwrk.$$$ to f:\ok.lib
No such file or directory

jianlinlong 2003-06-25
  • 打赏
  • 举报
回复
十分感谢 kingcaiyao(AKing), 不过我还是编译不过

[C++ Error] Unit1.cpp(41): E2268 Call to undefined function 'SetupDiEnumDevice'

我看DDK的Help也只有SetupDiEnumDeviceInfo,SetupDiEnumDeviceInterfaces。好像没有提到SetupDiEnumDevice

我真是太菜了!
xinghf 2003-06-25
  • 打赏
  • 举报
回复
找一下板卡的SDK
kingcaiyao 2003-06-25
  • 打赏
  • 举报
回复
是我写错了,应将SetupDiEnumDevice改为:
SetupDiEnumDeviceInterface
加载更多回复(29)

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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