Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1187180515
Andy BitOff
2007-08-15 16:21
2007.09.09
Есть ли функция возвращающая...


15-1186835172
Kolan
2007-08-11 16:26
2007.09.09
Как добавить установку драйвера в инстолятор?


15-1187091840
Манол
2007-08-14 15:44
2007.09.09
Нужен совет профессионала


15-1186560851
Галинка
2007-08-08 12:14
2007.09.09
DecimalSeparator опять


2-1187250109
alles
2007-08-16 11:41
2007.09.09
Вопрос по Exception в TThread-е





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский