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);
}
Отключение USB Device
Код:
Все как бы работает, но есть один неприятный момент - само устройство видимо и в системе зарегистрирован диск если "пойти по нему" ругается что его нет а флеха "горит" - те включена.
Вот теперь сам вопрос, как сделать что бы она "потухла" (молоток не подходит к сожалению) и убрался привод - отключить сам порт (хотя не выход, так как если подключить к нему по новому то он оказывается рабочим), видимо надо послать что-то устройству (или отключить сам логический диск) что бы она отключилось, но ЧТО - соображалки в данный момент не хватает...
Заранее спасибо...
попробуй отключить через Setup API, чисто как альтернатива
Вот что наваял за последнее время
Код:
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);
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);
DeleteVolumeMountPoint(name);
диск больше не виден но при последующем сооединении флэха недоступна...
Я жестко ошибся по поводу WDK, это некоторые SetupAPI работают начиная с ХР а вот если использовать CM_Request_Device_Eject(_Ex) то под 2000 пойдет. Сейчас качну Windows Server 2003 SP1 DDK и плотно займусь...
в этой статье написано как безопасно извлечь устройство с помощью этой функции.
если вариант через CM_Request_Device_Eject подходит, то
Вот результат изучения материала
Код:
//*************************************************************
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;
}
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;
}