Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

Работа с 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
1-1183280902
JanMihail
2007-07-01 13:08
2007.09.09
Как узнать позицию каретки в чужом окне?


2-1186672568
1c_user
2007-08-09 19:16
2007.09.09
Не показывается картинка на форме с помощью loadfromfile. почему?


2-1187100069
neodream
2007-08-14 18:01
2007.09.09
Автозаполнение в TEdit


2-1187295427
wesel
2007-08-17 00:17
2007.09.09
Потоки


4-1174252365
rommel
2007-03-19 00:12
2007.09.09
Google toolbar