Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Жечь болванки с помощью WriteFile


Автор: 586 13.5.2006, 22:44
Недавно попробовал прочитать CD-ROM диск напрямую:

Код

.386
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib

.data
target    db "\\.\E:", 0     ; CD-ROM drive
rfile    db "ret.dmp", 0
err1    db "Failed to open CD-ROM drive", 0
err2    db "Failed to create output file", 0
err3    db "Cannot read CD-ROM drive", 0
msg1    db "Complete", 0

.data?
buff    db 0C000h dup(?)
hDrv    dd ?
hFile    dd ?
rval    dd ?

.code
start:
invoke CreateFile, offset target, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0
or eax, eax
jnz @f
invoke MessageBoxA, 0, offset err1, 0, 16
invoke ExitProcess, 0

@@:
mov hDrv, eax
invoke CreateFile, offset rfile, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
or eax, eax
jnz @f
invoke MessageBoxA, 0, offset err2, 0, 16
invoke CloseHandle, 0
invoke ExitProcess, 0

@@:
mov hFile, eax
invoke ReadFile, hDrv, offset buff, 0C000h, offset rval, 0
.if rval!=0C000h
 invoke MessageBoxA, 0, offset err3, 0, 16
 jmp exit
.endif
invoke WriteFile, hFile, offset buff, 0C000h, offset rval, 0
invoke MessageBoxA, 0, offset msg1, 0, 64

exit:
invoke CloseHandle, hDrv
invoke CloseHandle, hFile
invoke ExitProcess, 0
end start


Программа записывает первые 48 килобайт диска  E: в файл "ret.dmp".
Я проанализировал полученный файл в HEX-редакторе и обнаружил, что я получил часть образа CD-диска.

Внимание, вопрос: А что, если я попробую записать на чистый CD-ROM образ диска через  WriteFile?
Получится? 

Автор: sgi1981 14.5.2006, 01:24
 smile Ну так если на ПК установлен специальный драйвер для работы с сидюками, то чего же не получится. Получится, конечно !
Но как правило такие драйвера - редкость. 
Это раз.
И в таком случае ничего удивительного не будет, потому что ОС при выполнении своей функции WriteFile будет вызывать функции этого драйвера. 
Это два.
 smile  

Автор: rsm 14.5.2006, 12:56
Цитата(586 @  14.5.2006,  00:44 Найти цитируемый пост)
Получится?

В принципе - да, получится. Данные действительно будут записаны на диск. Только вот читаться нормально не будут, т.к. для этого нужно закрыть последнюю сессию. Кроме того, это будет работать только в Вин ХР\2003 (и старше) и только если в свойствах пишушего привода разрешена запись.
См. в аттаче пример нормальной записи файла на диск с последующим закрытием сессии.

З.Ы. 
Код
invoke CreateFile, ; ...
or eax, eax    
jnz @f ; неправильно, т.к. при ошибке условие не выполнится (см. справку по CreateFile)

Код
invoke CreateFile, ; ...
test eax, eax    
jns @f ; правильно

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)