阅读:1356回复:1
请问如何用纯API函数和createfile打开guid设备?
我要在delphi中使用api函数打开我的WDM驱动并用devicecontrol进行控制,ds提供的openbyinterface好像太复杂了,还用到了CDeviceInterfaceClass和CDeviceInterface类,请大佬指点!
|
|
最新喜欢:![]()
|
沙发#
发布于:2002-08-09 11:42
这个很通用啦,instance取0就好了。SetupApi.h和SetupApi.Lib
HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance) { // Get handle to relevant device information set HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(info==INVALID_HANDLE_VALUE) { printf(\"No HDEVINFO available for this GUID\\n\"); return NULL; } // Get interface data for the requested instance SP_INTERFACE_DEVICE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); while(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata)) { if(GetLastError()==ERROR_NO_MORE_ITEMS) { printf(\"No SP_INTERFACE_DEVICE_DATA available for this GUID instance\\n\"); SetupDiDestroyDeviceInfoList(info); return NULL; } else { instance++; } } // Get size of symbolic link name DWORD ReqLen; SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]); if( ifDetail==NULL) { SetupDiDestroyDeviceInfoList(info); return NULL; } // Get symbolic link name ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL)) { SetupDiDestroyDeviceInfoList(info); delete ifDetail; return NULL; } printf(\"Symbolic link is %s\\n\",ifDetail->DevicePath); // Open file HANDLE rv = CreateFile( ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if( rv==INVALID_HANDLE_VALUE) { rv = NULL; } delete ifDetail; SetupDiDestroyDeviceInfoList(info); return rv; } |
|
|