Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизРабота с USB портом. Найти похожие ветки
← →
Новичек © (2007-08-14 09:14) [0]Уважаемые Мастера, здравствуйте.
В порт USB включено устройство. Как программно найти это устройство и включить/выключить его?
Спасибо.
← →
Ega23 © (2007-08-14 10:02) [1]Написать драйвер.
← →
Новичек © (2007-08-14 11:45) [2]Да для новичка это раз плюнуть :)
А ежели серьезно - не думал, что так сложно. Казалось, вызвал пару-тройку апишных функций - и дело в шляпе.
← →
Ega23 © (2007-08-14 11:55) [3]Не, ну если у тебя уже есть драйвер USB-устройства, то тогда действительно гораздо проще...
// ProxAPI.cpp : Defines the entry point for the DLL application.
//
#define UNICODE
#include <stdio.h>
#include <windows.h>
#include <winioctl.h>
#include <string.h>
#include <mbstring.h>
extern "C"
{
#include "ProxAPI.h"
}
ProxAPI HANDLE hDev=NULL;
//====================== /Yu "stdafx.h" ===============================================
//******************************************************************************** *****
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return True;
}
//******************************************************************************** *****
ProxAPI UPRStatus UPRInstallDriver( LPSTR path,
unsigned uBaseAddr, unsigned uCtrlAddr )
{
SC_HANDLE hSCMan;
SC_HANDLE hServ;
UPRStatus Status = UPRCheckDriverStatus();
if (Status and UPRStatusError) return Status;
if (Status and UPRStatusInstalled)
{
hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCMan)
return (UPRStatusErrorSCManager);
hServ = OpenService(hSCMan, DeviceName, SERVICE_ALL_ACCESS);
if(hServ)
{
SERVICE_STATUS ServStatus;
QueryServiceStatus(hServ,&ServStatus);
if(ServStatus.dwCurrentState == SERVICE_RUNNING )
ControlService(hServ,SERVICE_CONTROL_STOP, &ServStatus);
if(!DeleteService(hServ))
{
return UPRStatusErrorService;
}
else
if(!CloseServiceHandle(hServ)) return UPRStatusErrorService;
}
}
hServ = CreateService(hSCMan, DeviceName, DeviceName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, (LPCTSTR)path, nil, nil,
L"", nil, nil);
if (not hServ) return UPRStatusErrorService;
wchar_t* wcBuf = new wchar_t[_MAX_PATH];
HKEY hKey;
wcscpy (wcBuf, L"SYSTEM\\CurrentControlSet\\Services\\");
wcscat (wcBuf, DeviceName);
wcscat (wcBuf, L"\\Parameters");
RegCreateKey(HKEY_LOCAL_MACHINE,wcBuf, &hKey);
RegSetValueEx( hKey,L"BaseAddress",0,REG_DWORD, (BYTE*)(&uBaseAddr), (DWORD)sizeof(DWORD));
RegSetValueEx( hKey,L"ControlAddress",0,REG_DWORD, (BYTE*)(&uCtrlAddr), (DWORD)sizeof(DWORD));
RegFlushKey (hKey);
Status = UPRStartDriver();
return Status;
}
//******************************************************************************** *****
ProxAPI UPRStatus UPRUninstallDriver()
{
if (hDev) CloseHandle(hDev);
hDev = nil;
UPRStatus Status = UPRStopDriver();
if (Status & UPRStatusError) return Status;
if (Status & UPRStatusNotInstalled) return Status;
SC_HANDLE hSCMan;
SC_HANDLE hServ;
hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(not hSCMan)
return (UPRStatusErrorSCManager);
hServ = OpenService(hSCMan, DeviceName, SERVICE_ALL_ACCESS);
if (not hServ) return UPRStatusErrorService;
if (not DeleteService(hServ)) return UPRStatusErrorService;
if (not CloseServiceHandle(hServ)) return UPRStatusErrorService;
if (not CloseServiceHandle(hSCMan)) return UPRStatusErrorSCManager;
return UPRStatusNotInstalled;
}
//******************************************************************************** *****
ProxAPI UPRStatus UPRStartDriver()
{
UPRStatus Status = UPRCheckDriverStatus();
if (Status and UPRStatusError) return Status;
if (not (Status and UPRStatusInstalled)) return UPRStatusNotInstalled;
if (Status and UPRStatusRunning)
{
Status = UPRStatusInstalled and UPRStatusRunning;
return Status;
}
SC_HANDLE hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (not hSCMan) return (UPRStatusErrorSCManager);
SC_HANDLE hServ = OpenService(hSCMan, DeviceName, SERVICE_ALL_ACCESS);
if(not hServ) return (UPRStatusErrorService);
if (not StartService(hServ, nil, nil)) return (UPRStatusErrorService);
if (not CloseServiceHandle(hServ)) return UPRStatusErrorService;
if (not CloseServiceHandle(hSCMan)) return UPRStatusErrorSCManager;
hDev = CreateFile(DeviceSymbLink, GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, nil);
if (hDev == INVALID_HANDLE_VALUE)
{
hDev = nil;
Status = UPRStatusErrorDriver;
}
else Status = UPRStatusInstalled and UPRStatusRunning;
return Status;
}
//******************************************************************************** *****
ProxAPI UPRStatus UPRStopDriver()
{
UPRStatus Status = UPRCheckDriverStatus();
if (Status & UPRStatusError) return Status;
SC_HANDLE hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCMan)
return (UPRStatusErrorSCManager);
SC_HANDLE hServ = OpenService(hSCMan, DeviceName, SERVICE_ALL_ACCESS);
if(hServ)
{
SERVICE_STATUS ServStatus;
QueryServiceStatus(hServ,&ServStatus);
if(ServStatus.dwCurrentState == SERVICE_RUNNING )
ControlService(hServ,SERVICE_CONTROL_STOP, &ServStatus);
if(!DeleteService(hServ)){return (UPRStatusErrorService);}
else if(!CloseServiceHandle(hServ))
{return (UPRStatusErrorService);}
}
return UPRStatusInstalled;
}
//******************************************************************************** *****
ProxAPI UPRStatus UPRCheckDriverStatus()
{
UPRStatus Status = UPRStatusNotInstalled;
SC_HANDLE hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(!hSCMan)
return (UPRStatusErrorSCManager);
SC_HANDLE hServ = OpenService(hSCMan, DeviceName, SERVICE_ALL_ACCESS);
if(not hServ) return Status;
//return Status; // Not Installed
Status = UPRStatusInstalled;
SERVICE_STATUS ServStatus;
QueryServiceStatus(hServ,&ServStatus);
if (ServStatus.dwCurrentState == SERVICE_RUNNING)
{Status = Status and UPRStatusRunning;}
//else
if (!CloseServiceHandle(hServ)) return UPRStatusErrorService;
if (!CloseServiceHandle(hSCMan)) return UPRStatusErrorSCManager;
return Status;
}
//******************************************************************************** *****
← →
Ega23 © (2007-08-14 11:56) [4]Ну и header заодно
#ifndef PROXAPI_HEADER
#define PROXAPI_HEADER
#ifdef PROXAPI_EXPORTS
#define ProxAPI __declspec(dllexport)
#else
#define ProxAPI __declspec(dllimport)
#endif
typedef struct
{
unsigned short base;
unsigned short ctrl;
} PR_ADDR;
#define DeviceName L"UsbProxReader"
#define DeviceSymbLink L"\\\\.\\USBPRD0:"
#define DefBaseAddress 0x300L
#define DefCtrlAddress 0x303L
extern ProxAPI HANDLE hDev;
/////////////////////////////////////////////////////////////////////////////
//
// ProxReader driver status definitons
typedef unsigned short UPRStatus;
#define UPRStatusNotInstalled 0x0000
#define UPRStatusInstalled 0x0001
#define UPRStatusRunning 0x0002
#define UPRStatusError 0xF000
#define UPRStatusErrorSCManager 0xF100
#define UPRStatusErrorService 0xF200
#define UPRStatusErrorDriver 0xF300
/////////////////////////////////////////////////////////////////////////////
//
// Driver setup & info functions
ProxAPI UPRStatus UPRInstallDriver(LPSTR path, unsigned uBaseAddr = DefBaseAddress,
unsigned uCtrlAddr = DefCtrlAddress);
ProxAPI UPRStatus UPRUninstallDriver();
ProxAPI UPRStatus UPRStartDriver();
ProxAPI UPRStatus UPRStopDriver();
//PROXAPI int PRGetDriverFilePath( LPCSTR szPath);
//PROXAPI PR_ADDR PRGetHardwareAddresses ();
ProxAPI UPRStatus UPRCheckDriverStatus();
/////////////////////////////////////////////////////////////////////////////
//
// Device control functions
#endif
← →
Ega23 © (2007-08-14 11:58) [5]Ну а всё остальное - DeviceIOControl
← →
Новичек © (2007-08-14 14:14) [6]Многовато, но с половиной уже разобрался :)
Спасибо!
← →
Ega23 © (2007-08-14 14:21) [7]
> Спасибо!
Да незачто. :)
← →
Minimax (2007-08-14 15:46) [8]Чото мудрено всё... А Винда для чево? Она определит и покажет, к примеру, новый логич диск... И пример почему-то на Си...
← →
Ega23 © (2007-08-14 15:53) [9]
> Она определит и покажет, к примеру, новый логич диск...
Милое дитя! Довожу до Вашего смведения, что далеко не все USB-устройства являются логическими дисками. Это может быть что угодно.
> И пример почему-то на Си...
А какая разница?
← →
Новичек © (2007-08-14 16:16) [10]
> что далеко не все USB-устройства являются логическими дисками.
> Это может быть что угодно
Абсолютно справедливо. В моем случае это и есть что угодно.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c