hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1862回复:8

好不容易写了个驱动程序,调试都通过了,就是不能用

楼主#
更多 发布于:2002-03-29 17:29
大家帮帮忙
驱动程序安装也没问题,运行也正常
可是,我没办法进行读写操作,甚至无法用createfile打开,怎么办?
大虾,帮帮忙,我该怎么写 createfile (\"....这里的参数?\",..   ),
第一个设备名该用什么?注册表里是哪个键?

我的驱动是没有实际设备的端口操作,真糟糕透了!
期望解答,可以给高分!
恒坚电器([url]http://www.hejoin.com[/url])
drinkeryj
驱动老牛
驱动老牛
  • 注册日期2001-03-23
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-29 17:57
首先你得确定你的inf文件是否正确,如果没问题,参照以下代码.
以下是我用过的一个打开设备驱动的程序你可以根据你的实际情况改一下.
#include <stdlib.h>
#include <windows.h>
#include <winioctl.h>
#include <devintf.h>

#define PCI2040Device_CLASS_GUID \\
 { 0xbec721be, 0x20e1, 0x44fb, { 0xb5, 0x4c, 0xd3, 0x6a, 0x79, 0xc5, 0xa6, 0x42 } }//你自己的guid号

HANDLE hDevice = INVALID_HANDLE_VALUE;
GUID ClassGuid = PCI2040Device_CLASS_GUID;

HANDLE OpenByInterface(
GUID* pClassGuid, // points to the GUID that identifies the interface class
DWORD instance, // specifies which instance of the enumerated devices to open
PDWORD pError // address of variable to receive error status
)
{
HANDLE hDev;
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;

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;
}

main()
{
hDevice = OpenByInterface( &ClassGuid, 0, &Error);
if (hDevice == INVALID_HANDLE_VALUE)
{
printf(\"ERROR opening device: (%0x) returned from CreateFile\\n\", GetLastError());
Exit(1);
}
else
{
printf(\"Device found, handle open.\\n\");
}
}

//以下就是#include <devintf.h>文件,在driverstudio中有,如果没有
//driverstudio,就用以下代码直接生成,setupapi.h和tchar.h在ddk中有

#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;
}

}

以后怎么办? [img]http://www.driverdevelop.com/forum/upload/Xman/2004-04-05_2004324183110706.jpg[/img]
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-29 18:15
这种方法麻烦一些,不知道能不能利用设备名打开?
比如\"\\\\\\\\.\\\\myfile\" 或者 直接用 “myfile\"来打开?
这也不是可以打开川口并口之类的吗?
本来也直接用这种方式读写,可是,这样对端口操作起来非常不方便,周期太长,无法控制读写进度和时序,才改为驱动,要不是这个win2000的霸道,我可以好好休息这个周末了,
现在还在这里麻烦各位大哥!真不好意思!
恒坚电器([url]http://www.hejoin.com[/url])
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-03-29 19:46
用户被禁言,该主题自动屏蔽!
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-29 22:29
如何注册链接符?
还请高手指点!
多谢!感激不尽!
恒坚电器([url]http://www.hejoin.com[/url])
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-29 23:39
NTSTATUS
  IoCreateDevice(
    IN PDRIVER_OBJECT  DriverObject,
    IN ULONG  DeviceExtensionSize,
    IN PUNICODE_STRING  DeviceName  OPTIONAL,
    IN DEVICE_TYPE  DeviceType,
    IN ULONG  DeviceCharacteristics,
    IN BOOLEAN  Exclusive,
    OUT PDEVICE_OBJECT  *DeviceObject
    );
在第三个参数使用你已经转化为UNICODE的名称
NTSTATUS
  IoCreateSymbolicLink(
    IN PUNICODE_STRING  SymbolicLinkName,
    IN PUNICODE_STRING  DeviceName
    );
第二个就是上面的设备名称,第一个参数就是你需要提供给应用程序的符号连接
象这样
WCHAR wideLinkName[64];
swprintf(wideLinkName,
         L\"\\\\DosDevices\\\\CdRom%d\",
         1);
RtlInitUnicodeString(&unicodeLinkName,
                     wideLinkName);
status =
        IoCreateSymbolicLink(&unicodeLinkName,
                         &DeviceName);

然后在你的应用程序里面
       createfile(\"\\\\x\\\\CdRom1\",
                  ...)
x是.还是??我忘了,自己查一查吧!好象是.
就可以了

[编辑 -  3/29/02 作者: guardee]
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-03-30 09:29
特别感谢大虾们帮忙!
非常谢谢!

我去试试看!
恒坚电器([url]http://www.hejoin.com[/url])
hejoin
驱动小牛
驱动小牛
  • 注册日期2001-10-19
  • 最后登录2012-03-08
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望51点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-03-30 09:45
已经成功!
再次感谢各位朋友的帮忙!
谢谢了!
怎么给分?请告知!
恒坚电器([url]http://www.hejoin.com[/url])
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-03-30 16:42
在你发的这个标题的第一个帖子有一个“给分”的按纽
游客

返回顶部