阅读:1862回复:8
好不容易写了个驱动程序,调试都通过了,就是不能用
大家帮帮忙
驱动程序安装也没问题,运行也正常 可是,我没办法进行读写操作,甚至无法用createfile打开,怎么办? 大虾,帮帮忙,我该怎么写 createfile (\"....这里的参数?\",.. ), 第一个设备名该用什么?注册表里是哪个键? 我的驱动是没有实际设备的端口操作,真糟糕透了! 期望解答,可以给高分! |
|
|
沙发#
发布于: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; } } |
|
|
板凳#
发布于:2002-03-29 18:15
这种方法麻烦一些,不知道能不能利用设备名打开?
比如\"\\\\\\\\.\\\\myfile\" 或者 直接用 “myfile\"来打开? 这也不是可以打开川口并口之类的吗? 本来也直接用这种方式读写,可是,这样对端口操作起来非常不方便,周期太长,无法控制读写进度和时序,才改为驱动,要不是这个win2000的霸道,我可以好好休息这个周末了, 现在还在这里麻烦各位大哥!真不好意思! |
|
|
地板#
发布于:2002-03-29 19:46
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-03-29 22:29
如何注册链接符?
还请高手指点! 多谢!感激不尽! |
|
|
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] |
|
6楼#
发布于:2002-03-30 09:29
特别感谢大虾们帮忙!
非常谢谢! 我去试试看! |
|
|
7楼#
发布于:2002-03-30 09:45
已经成功!
再次感谢各位朋友的帮忙! 谢谢了! 怎么给分?请告知! |
|
|
8楼#
发布于:2002-03-30 16:42
在你发的这个标题的第一个帖子有一个“给分”的按纽
|
|