Заблокировать или извлечь флешку программно ( С++ )
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Заблокировать или извлечь флешку программно ( С++ ) - 2010-07-26 14:03:24.420000
|
|
|
Benjamen
Сообщений: 39
Оценки: 0
Присоединился: 2010-06-12 18:53:32.043333
|
Заблокировать флешку или внешний HDD на компьютере. Не порт USB блокировать, а именно одну какую то флешку подключенную к USB. Как можно это сделать в С++ или через командную строку…. Хочется конечно это провернуть через WinAPI… PS … В Windowse есть функция извлечь флешь карту… Есть ли такая функция в командной строке.. (думаю есть) но как она звучит…
|
|
|
RE: Заблокировать или извлечь флешку программно ( С++ ) - 2010-07-26 14:47:30.813333
|
|
|
Kali0stro
Сообщений: 38
Оценки: 0
Присоединился: 2010-05-26 10:43:43.710000
|
Реально через WinAPI или Windows SCriptHost
|
|
|
RE: Заблокировать или извлечь флешку программно ( С++ ) - 2010-07-26 16:39:02.596666
|
|
|
scsi.aka.api
Сообщений: 122
Оценки: 0
Присоединился: 2008-07-02 00:58:06.646666
|
попробуй так… может можно как-то по другому… я С++ плохо знаю,и мало пользуюсь…
//*************************************************************
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;
}
хотя может еще через WM_DEVICECHANGE Message можно.. http://msdn.microsoft.com/en-us/library/aa363480.aspx
|
|
|
RE: Заблокировать или извлечь флешку программно ( С++ ) - 2010-07-27 13:24:43.403333
|
|
|
Benjamen
Сообщений: 39
Оценки: 0
Присоединился: 2010-06-12 18:53:32.043333
|
Пробовал пред идущий код… Проблема в том что выдает ошибку на - if( CM_Get_Device_ID_Size(&size,DevInst,0) == CR_SUCCESS ) Заинклудил библиотеку windows.h Ошибка также. Что делать… Подскажите пожалуйста… Искал в интернете насчёт извлечения флешки, но полезной инфо = 0. Есть ли другой способ… К примеру не извлекать флешку. а к примеру сделать не доступным ну к примеру через мой компьютер или же тупа что бы флешка не открывалась…. Риестор не вариант - в локальной сети буду ставить программу… она должна работать с нашей групповой политикой безопасности - риестору нет доступа….
|
|
|
|
|