Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2017, 20:44   #1
iren10.06.1986
 
Регистрация: 07.02.2016
Сообщений: 7
По умолчанию В готовую программу "вписать" мою флешку

необходимо, чтобы программа останавливала именно мою флешку. помогите отредактировать готовую программу.
Вот информация по моей флешке
USBSTOR\DiskQUMO____USB_FLASH_DRIVE _PMAP
USBSTOR\DiskQUMO____USB_FLASH_DRIVE _
USBSTOR\DiskQUMO____
USBSTOR\QUMO____USB_FLASH_DRIVE_P
Код:
program EjectFlesh;
{$MODE OBJFPC}
uses
 Windows, strings;
const
 setupapi = 'SetupApi.dll';
 GUID_DEVCLASS_DISKDRIVE: TGUID = (D1: $4D36E967; D2: $E325; D3: $11CE; D4: ($BF, $C1, $08, $00, $2B, $E1, $03, $18)); // GUID класса накопителей
 GUID_DEVCLASS_USB: TGUID = (D1: $36FC9E60; D2: $C465; D3: $11CF; D4: ($44, $45, $53, $54, $00, $00 , $00, $00)); // GUID класса хост-контроллера и USB хабов;
type
 HDEVINFO = THandle;
 PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA;
   SP_DEVINFO_DATA = packed record
                           cbSize : DWORD;
                     ClassGuid : TGUID;
                          DevInst : DWORD;
                       Reserved : DWORD;
   end;
var
                          q: char;
        hDevInfoSet: HDEVINFO;
               DevInfo: SP_DEVINFO_DATA;
                           i: Integer;
                 Parent: DWORD;
          VetoName: PChar;
 VetoNameString: String;
// функции из SetupApi.dll
function SetupDiGetClassDevsA(ClassGuid: PGUID; Enumerator: PChar; hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall; external setupapi; //дескриптор класса устройства
function SetupDiEnumDeviceInfo(DeviceInfoSet: HDEVINFO; MemberIndex: DWORD; DeviceInfoData: PSP_DEVINFO_DATA): boolean; stdcall; external setupapi; //инф-ия об устройстве класса
function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): boolean; stdcall; external setupapi; //удаляет информацию об устройствах данного класса и очищает память
function CM_Get_Parent(pdnDevInst: PDWORD; dnDevInst: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; //получ. дескриптор родительской ветки  в дереве устройств
function CM_Get_Device_ID_Size(pulLen: PDWORD; dnDevInst: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; // размер строки идентификатора устройства
function CM_Get_Device_IDA(dnDevInst: DWORD; Buffer: PChar; BufferLen: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; // текстовый идентификатор экземпляра устройства
function CM_Locate_DevNodeA(pdnDevInst: PDWORD; pDeviceID: PChar; ulFlags: DWORD): DWORD; stdcall; external setupapi; // получ. дескриптор устр-ва по строке ИД
function CM_Request_Device_EjectA(dnDevInst: DWORD; pVetoType: Pointer; pszVetoName: PChar; ulNameLength: DWORD; ulFlags: DWORD): DWORD; stdcall; external setupapi; //безопасное извлечение
function CompareMem(p1, p2: Pointer; len: DWORD): boolean;
var
      i: DWORD;
begin
 result := false;
 if len = 0 then exit;
 for i := 0 to len-1 do
  if PByte(DWORD(p1) + i)^ <> PByte(DWORD(p2) + i)^ then exit;
 result := true;
end;
function IsUSBDevice(DevInst: DWORD): boolean;
var
    IDLen: DWORD;
          ID: PChar;
 IDString: String;
begin
 result := false;
 IDString := 'USBSTOR\DiskVerbatimSTORE_N_GO______1.0_'; //ИД устройства
 if (CM_Get_Device_ID_Size(@IDLen, DevInst, 0) <> 0) or (IDLen = 0) then exit;
 inc(IDLen);
 ID := GetMemory(IDLen);
 if ID = nil then exit;
 if ((CM_Get_Device_IDA(DevInst, ID, IDLen, 0) <> 0) or (not (CompareMem(ID, PChar('USBSTOR'), 7)))) then
  begin
   IDString := StrPas(ID);
   FreeMemory(ID);
   exit;
  end;
 IDString := StrPas(ID);
 Write('Eject flash-disk?(y - yes; Any other key - no)');
 ReadLn(q);
 if q = 'y' then result := true;
 FreeMemory(ID);
end;
BEGIN
 DevInfo.cbSize := sizeof(SP_DEVINFO_DATA);
 hDevInfoSet := SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2);
 if hDevInfoSet = INVALID_HANDLE_VALUE then exit;
 i := 0;
 while (SetupDiEnumDeviceInfo(hDevInfoSet, i, @DevInfo)) do
 begin
  if IsUSBDevice(DevInfo.DevInst) then
   begin
    if CM_Get_Parent(@Parent, DevInfo.DevInst, 0) = 0 then
     begin
      VetoName := GetMemory(260);
      if (CM_Request_Device_EjectA(Parent, nil, VetoName, 260, 0) <> 0) then
       begin
        if (CM_Locate_DevNodeA(@Parent, VetoName, 0) <> 0) then
         begin
          FreeMemory(VetoName);
          continue;
         end;
        FreeMemory(VetoName);
        if (CM_Request_Device_EjectA(Parent, nil, nil, 0, 0) <> 0) then continue;
       end;
      VetoNameString := StrPas(VetoName);
      FreeMemory(VetoName);
      break;
     end;
   end;
  inc(i);
 end;
 SetupDiDestroyDeviceInfoList(hDevInfoSet);
END.

Последний раз редактировалось Alex11223; 15.03.2017 в 21:06.
iren10.06.1986 вне форума Ответить с цитированием
Старый 11.10.2017, 12:01   #2
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Полистайте DRKB.
dummy_user вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Описать класс "Треугольник" (Изменить готовую задачу)) Meloiso Помощь студентам 2 18.12.2013 20:58
Функция system(""); как вписать несколько строк ? mysan Общие вопросы C/C++ 0 12.09.2012 22:51
как сделать готовую программу "условно-бесплатной"? **Татьяна** Безопасность, Шифрование 3 13.02.2011 13:08