Появилась идея сделать утилиту которая лежит на флэшке и при запуске размонтирует и выключает флэшку.
Что нибудь типа UnmountMe.exe или TurnOffMe.exe.
Первый этап - отработать механизм отключения флэшки.
Первый код такой
#FSCTL_LOCK_VOLUME = $90018 #FSCTL_UNLOCK_VOLUME = $9001C #FSCTL_DISMOUNT_VOLUME = $90020 Procedure.s GetSysErrorText(ErrCode) Define result.s="" *Memory = AllocateMemory (255) length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, ErrCode, 0, *Memory, 255, #Null) result=PeekS (*Memory, length - 2) FreeMemory (*Memory) ProcedureReturn result EndProcedure Procedure.s StrToOEM(st.s) Define String.s=st CharToOem_(@String, @String) ProcedureReturn String EndProcedure OpenConsole() Define Disk$ ;Disk$=Left(ProgramFilename(),2) Disk$="I:" PrintN("Try to lock of disk "+Disk$) ;создать хэндл hFile=CreateFile_("\\.\"+Disk$,#GENERIC_READ|#GENERIC_WRITE, #FILE_SHARE_WRITE | #FILE_SHARE_READ, 0, #OPEN_EXISTING, 0, 0) If hFile ;проверить блокировкой свободность диска Define Size_of_output_data Result=DeviceIoControl_(hFile, #FSCTL_LOCK_VOLUME, 0, 0, 0, 0, @Size_of_output_data, 0) If Result PrintN(Disk$+" Lock OK") PrintN("Size_of_output_data="+Str(Size_of_output_data)) PrintN("") Print("Press any key ....") Repeat KeyCode$=Inkey() Until KeyCode$<>"" PrintN("") ;размонтировать том Result=DeviceIoControl_(hFile, #FSCTL_DISMOUNT_VOLUME, 0, 0, 0, 0, @Size_of_output_data, 0) If Result PrintN(Disk$+" DisMount OK") PrintN("Size_of_output_data="+Str(Size_of_output_data)) Else PrintN(Disk$+" DisMount failed") PrintN("Size_of_output_data="+Str(Size_of_output_data)) ErrCode=GetLastError_() PrintN("ErrCode="+Str(ErrCode)+":"+StrToOEM(GetSysErrorText(ErrCode))) EndIf ; Result=DeviceIoControl_(hFile, #FSCTL_UNLOCK_VOLUME, 0, 0, 0, 0, @Size_of_output_data, 0) ; If Result ; PrintN(Disk$+" UnLock OK") ; PrintN("Size_of_output_data="+Str(Size_of_output_data)) ; Else ; PrintN(Disk$+" UnLock failed") ; PrintN("Size_of_output_data="+Str(Size_of_output_data)) ; ErrCode=GetLastError_() ; PrintN("ErrCode="+Str(ErrCode)+":"+StrToOEM(GetSysErrorText(ErrCode))) ; EndIf Else PrintN(Disk$+" Lock failed") PrintN("Size_of_output_data="+Str(Size_of_output_data)) ErrCode=GetLastError_() PrintN("ErrCode="+Str(ErrCode)+":"+StrToOEM(GetSysErrorText(ErrCode))) EndIf ;закрыть CloseHandle_(hFile) Else PrintN("Error opening for disk "+Disk$) ErrCode=GetLastError_() PrintN("ErrCode="+Str(ErrCode)+":"+StrToOEM(GetSysErrorText(ErrCode))) EndIf PrintN("") Print("Press any key ....") Repeat KeyCode$=Inkey() Until KeyCode$<>""
Сначала блокирую том.
Если не блокируется - значит есть открытые файлы - проверено.
Если блокировано - доступ из других процессов закрыт.
Далее размонтирование тома.
Вроде проходит. Но это не есть отключение флэшки как я рассчитывал.
Лазил-лазил по http://msdn.microsoft.com/en-us/library/ms123401.aspx
в поисках отключающих функций - ничего не нашел.
Может кто подскажет - как отключить флэшку.
Или где еще поискать можно.