PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Размонтирование и выключение флэшки


Размонтирование и выключение флэшки

Сообщений 1 страница 2 из 2

1

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

0

2

Кликай
Кликай
Кликай

Отредактировано Дмитрий (14.12.2011 11:39:09)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Размонтирование и выключение флэшки