Появилась идея сделать утилиту которая лежит на флэшке и при запуске размонтирует и выключает флэшку.
Что нибудь типа 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
в поисках отключающих функций - ничего не нашел.
Может кто подскажет - как отключить флэшку.
Или где еще поискать можно.