Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отключение USB Device

342
20 марта 2009 года
Yos
209 / / 21.06.2003
Если вкратце излагать суть проблемы, то выглядит она следующим образом - есть флешка которая подключена, я ее отключаю следующим образом:

Код:
wsprintf(name,"\\\\.\\%c:",((CHAR)device)+'A');

 hVolume = CreateFile(name,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
 if( hVolume != INVALID_HANDLE_VALUE )
 {
    for( i=0; i<10; i++ )
    {
        if( DeviceIoControl(hVolume,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&size,NULL) )
        {
            DeviceIoControl(hVolume,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&size,NULL);
            Prevent.PreventMediaRemoval = FALSE;
            DeviceIoControl(hVolume,IOCTL_STORAGE_MEDIA_REMOVAL,&Prevent,sizeof(PREVENT_MEDIA_REMOVAL),NULL,0,&size,NULL);
            DeviceIoControl(hVolume,IOCTL_STORAGE_EJECT_MEDIA,NULL,0,NULL,0,&size,NULL);
            DeviceIoControl(hVolume,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&size,NULL);

            // удаляем из списка
            pDeviceContainer->DeleteDevice(((CHAR)device)+'A');
       
            break;
        }

        Sleep(500);
    }

    CloseHandle(hVolume);
 }


Все как бы работает, но есть один неприятный момент - само устройство видимо и в системе зарегистрирован диск если "пойти по нему" ругается что его нет а флеха "горит" - те включена.

Вот теперь сам вопрос, как сделать что бы она "потухла" (молоток не подходит к сожалению) и убрался привод - отключить сам порт (хотя не выход, так как если подключить к нему по новому то он оказывается рабочим), видимо надо послать что-то устройству (или отключить сам логический диск) что бы она отключилось, но ЧТО - соображалки в данный момент не хватает...

Заранее спасибо...
261
20 марта 2009 года
ahilles
1.5K / / 03.11.2005
попробуй отключить через Setup API, чисто как альтернатива
342
20 марта 2009 года
Yos
209 / / 21.06.2003
Я рассматривал этот вариант, но отказался по причине что это WDK и как следствие работает начиная с XP, а по "заданию" надо что бы и по 2000 работало...

Вот что наваял за последнее время

 
Код:
wsprintf(name,"%c:",((CHAR)device)+'A');
QueryDosDevice(name,device,MAX_TEXT_SIZE);
DefineDosDevice(DDD_RAW_TARGET_PATH|DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE,name,device);


появился интересный эфект - в Far'e уже диска не видно, но проводник выводит его со знаком вопроса и говорит что битая ссылка...

а если сделать

 
Код:
wsprintf(name,"%c:\\",((CHAR)device)+'A');
DeleteVolumeMountPoint(name);


диск больше не виден но при последующем сооединении флэха недоступна...
342
23 марта 2009 года
Yos
209 / / 21.06.2003
Я жестко ошибся по поводу WDK, это некоторые SetupAPI работают начиная с ХР а вот если использовать CM_Request_Device_Eject(_Ex) то под 2000 пойдет. Сейчас качну Windows Server 2003 SP1 DDK и плотно займусь...
261
23 марта 2009 года
ahilles
1.5K / / 03.11.2005
если вариант через CM_Request_Device_Eject подходит, то в этой статье написано как безопасно извлечь устройство с помощью этой функции.
342
23 марта 2009 года
Yos
209 / / 21.06.2003
Огромнейшее спасибо!!! А то с моим ломаным англицким столько ихних сайтов перелапатил, но вообщем идею понял :) а тут прямо все как нужно расписано.

Вот результат изучения материала
Код:
//*************************************************************
BOOL IsUSBDevice(DWORD DevInst)
{
 //****
 DWORD      size;

 LPBYTE     pData;

 BOOL       usb = FALSE;

 if( CM_Get_Device_ID_Size(&size,DevInst,0) == CR_SUCCESS )
 {
    if( size )
    {
        pData = (LPBYTE)GlobalAlloc(GPTR,size+1);
        if( pData )
        {
            if( CM_Get_Device_ID(DevInst,(PCHAR)pData,size+1,0) == CR_SUCCESS )
            {
                *(pData+7) = 0x00;
                if( !strcmp((char *)pData,"USBSTOR") ) usb = TRUE;
            }

            GlobalFree(pData);
        }
    }
 }

 return usb;
}

//*************************************************************
BOOL RemoveUSBDevice(DWORD DevInst)
{
 //****
 DWORD  Parent;

 CHAR   info[MAX_TEXT_SIZE];
 //
 if( IsUSBDevice(DevInst) && (CM_Get_Parent(&Parent,DevInst,0) == CR_SUCCESS) )
 {
    //
    wsprintf(info,"");
    if( CM_Request_Device_Eject(Parent,NULL,info,MAX_TEXT_SIZE,0) == CR_SUCCESS )
    {
        if( !strlen(info) ) return TRUE;
    }
 }

 return FALSE;
}

//*************************************************************
//*
//*
//*
//*************************************************************
BOOL GetDriveInfo(CHAR DriveLetter, LPDWORD pDriveInstance, LPSTR pDriveName)
{
 //****
 GUID                               DiskGUID = { 0x53F56307, 0xB6BF, 0x11D0, 0x94,0xF2,0x00,0xA0,0xC9,0x1E,0xFB,0x8B };

 HDEVINFO                           hDevices;
 HANDLE                             hDrive;
 HANDLE                             hVolume;

 CHAR                               name[MAX_TEXT_SIZE];
 BYTE                               data[MAX_TEXT_SIZE];

 PSP_DEVICE_INTERFACE_DETAIL_DATA   pDevInterDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)data;
 SP_DEVICE_INTERFACE_DATA           DevInterData;
 SP_DEVINFO_DATA                    DevInfoData;
 STORAGE_DEVICE_NUMBER              VolumeStorageDevNumber;
 STORAGE_DEVICE_NUMBER              DeviceStorageDevNumber;

 DWORD                              type;
 DWORD                              size;
 
 DWORD                              i;

 UINT                               DriveType;


 //
 wsprintf(name,"%c:\\",DriveLetter);
 DriveType = GetDriveType(name);
 if( (DriveType == DRIVE_REMOVABLE) || (DriveType == DRIVE_FIXED) )
 {
    //
    wsprintf(name,"\\\\.\\%c:",DriveLetter);
    hVolume = CreateFile(name,0,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
    if( hVolume != INVALID_HANDLE_VALUE )
    {
        //
        if( DeviceIoControl(hVolume,IOCTL_STORAGE_GET_DEVICE_NUMBER,NULL,0,&VolumeStorageDevNumber,sizeof(STORAGE_DEVICE_NUMBER),&(size=0),NULL) )
        {

            //
            //
            //

            //
            hDevices = SetupDiGetClassDevs(&DiskGUID,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
            if( hDevices != INVALID_HANDLE_VALUE)
            {
                //
                DevInterData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

                //
                for( i=0; SetupDiEnumDeviceInterfaces(hDevices,NULL,&DiskGUID,i,&DevInterData); i++ )
                {
                    //
                    SetupDiGetDeviceInterfaceDetail(hDevices,&DevInterData,NULL,0,&(size=0),NULL);
                    if( size && (size <= MAX_TEXT_SIZE) )
                    {
                        //
                        pDevInterDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
                        memset((void *)&DevInfoData, 0, sizeof(SP_DEVINFO_DATA));
                        DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

                        //
                        if( SetupDiGetDeviceInterfaceDetail(hDevices,&DevInterData,pDevInterDetailData,size,&size,&DevInfoData) )
                        {
                            //
                            hDrive = CreateFile(pDevInterDetailData->DevicePath,0,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL);
                            if( hDrive != INVALID_HANDLE_VALUE )
                            {
                                //
                                if( DeviceIoControl(hDrive,IOCTL_STORAGE_GET_DEVICE_NUMBER,NULL,0,&DeviceStorageDevNumber,sizeof(STORAGE_DEVICE_NUMBER),&(size=0),NULL) )
                                {
                                    //
                                    if( VolumeStorageDevNumber.DeviceNumber == DeviceStorageDevNumber.DeviceNumber )
                                    {
           
                                        //
                                        if( IsUSBDevice(DevInfoData.DevInst) )
                                        {
                                            if( SetupDiGetDeviceRegistryProperty(hDevices,&DevInfoData,SPDRP_FRIENDLYNAME,&(type=0),(BYTE *)name,MAX_TEXT_SIZE,&(size=0)) ) wsprintf(pDriveName,"%s",name);
                                            else if( SetupDiGetDeviceRegistryProperty(hDevices,&DevInfoData,SPDRP_DEVICEDESC,&(type=0),(BYTE *)name,MAX_TEXT_SIZE,&(size=0)) ) wsprintf(pDriveName,"%s",name);
                                            else wsprintf(pDriveName,"");

                                            CloseHandle(hDrive);
                                            SetupDiDestroyDeviceInfoList(hDevices);
                                            CloseHandle(hVolume);

                                            //
                                            *(pDriveInstance) = DevInfoData.DevInst;

                                            return TRUE;
                                        }

                                        else
                                        {
                                            CloseHandle(hDrive);
                                            SetupDiDestroyDeviceInfoList(hDevices);
                                            CloseHandle(hVolume);

                                            return FALSE;
                                        }
                                    }
                                }

                                CloseHandle(hDrive);
                            }
                        }
                    }
                }

                SetupDiDestroyDeviceInfoList(hDevices);
            }

            //
            //
            //

        }

        //
        CloseHandle(hVolume);
    }
 }
 
 return FALSE;
}

//*************************************************************
//*
//* Старт программы
//*
//*************************************************************
int main(int Count, char ** pArguments)
{
 //****
 DWORD      instance;
 CHAR       name[MAX_TEXT_SIZE];

 //
 for( CHAR d='A'; d<='Z'; d++ )
 {
    //
    if( GetDriveInfo(d,&instance,name) ) printf("%c: - %s\n",d,name);
 }
 
 return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог