|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 6, 2003 17:18:57 Объясните мне пожалуста, а что между этим есть разница?: .data? buffer dd ? или так: .data buffer dd 0 |
|
|
Дата: Авг 6, 2003 17:23:22 Asterix Мне кажется есть. ОК, подождём FFFF |
|
|
Дата: Авг 6, 2003 17:47:45 Во-вторых, линкер генерит всего одну секцию .data и сваливает туда все, что в исходнике было помечено как .data и как .data?. Только если не укажешь на то что BSS расшариваешь /SECTION:.bss,S |
|
|
Дата: Авг 6, 2003 17:54:31 Хм, собрал и проверил сишный код - у меня и асмовый и сишный работают одинаково и физически ничего не записывают, я потом сразу же читаю, и читается нормальный сектор (какой и был до записи). Все работает без ошибок. |
|
|
Дата: Авг 6, 2003 18:25:29 The Svin Уппс, так вот оно что было (вспомнил кое что из жизни)!!! А тогда вопрос, почему это так сделано? Что MS поменяло принцип неиницилизированных данных? |
|
|
Дата: Авг 6, 2003 19:08:53 [ Edmond: Ну во первых бут поганить не обязательно. Можно и в файл записать. ] Не - пропадет чистота эксперимента. К тому же anonim говорил, что в файло у него все пишется. [ Edmond: А разве память не выделяется динамически? ] Если ты имеешь ввиду секцию .data?, то да. Так должно быть, но на практике... [ Asterix: Объясните мне пожалуста, а что между этим есть разница?: ] В том то и дело, что нет, т.к. если собирать безо всяких хитрожопых ключей, то все будет свалено в одну секцию .data и инициализировано нулями. Хотя разница должна быть - все что в .data? должно попасть в отдельную неинициализированную секцию, с нулевым файловым размером. [ The Svin: Только если не укажешь на то что BSS расшариваешь ] Ну разумеется, я имел ввиду общий случай - без всяких наворотов ключами. anonim то так (без наворотов) и компилит. [ Edmond: Что MS поменяло принцип неиницилизированных данных? ] Да вряд ли. Скорее всего это попытка оптимизации. Если размер данных умещается в одну страницу, то какой смысл делать две секции, которые после загрузки будут иметь одинаковые атрибуты. А то, что секция на диске увеличивается это ерунда. Я не уверен, что это так - надо будет экскрементнуть на досуге. [ Edmond: подождём FFFF ] А хтойта? :-p ЗЫ: Вообще я мог где-то и натупить - надо будет внимательнее с этими секциями разобраться. |
|
|
Дата: Авг 6, 2003 19:44:55 · Поправил: Asterix Скомпилил два варианта. Да, так оно и есть, размер exe'шника отличается на 0.5 kB: ------------------------------------------------------------------- ------------------------------------------------------------------- .data?
cmdline dd ?
.code
start:
invoke GetCommandLine
mov cmdline, eax
mov esi,eax
metka:
.if byte ptr [esi]!=00h
.if byte ptr [esi]!=' '
inc esi
jmp metka
.endif
inc esi
.if byte ptr [esi]!='/'
jmp metka
.endif
inc esi
.endif
xor eax,eax
invoke MessageBox, eax,esi,eax,eax
invoke ExitProcess,NULL
end start
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.data
cmdline dd 0
.code
start:
invoke GetCommandLine
mov cmdline, eax
mov esi,eax
metka:
.if byte ptr [esi]!=00h
.if byte ptr [esi]!=' '
inc esi
jmp metka
.endif
inc esi
.if byte ptr [esi]!='/'
jmp metka
.endif
inc esi
.endif
xor eax,eax
invoke MessageBox, eax,esi,eax,eax
invoke ExitProcess,NULL
end start |
|
|
Дата: Авг 6, 2003 19:59:54 Four-F Ясно :))) А хтойта? :-p А? Да, так знакомый :) |
|
|
Дата: Авг 6, 2003 22:20:28 Похоже это действительно оптимизация или что-то вроде того. Вот подопытный кролик №1 (sections.bat): ;@echo off ;goto make .386 .model flat,stdcall option casemap:none _BSS SEGMENT buffer1 db 10h * 1000h dup(?) _BSS ENDS .data buffer2 db 10h * 1000h dup(0) .data? buffer3 db 10h * 1000h dup(?) .code start proc lea eax, buffer1 lea eax, buffer2 lea eax, buffer3 ret start endp end start :make set exe=sections \masm32\bin\ml /nologo /c /coff %exe%.bat \masm32\bin\link /nologo /subsystem:windows /section:.bss,s %exe%.obj del %exe%.obj echo. pause Если скомпилить его так, как показано, то создается секция .bss и в нее помещается buffer1 и buffer3. Т.е директива .data? работает как надо. .data VirtualSize = 10000h RawSize = 10000h .bss VirtualSize = 20000h RawSize = 00000h Если же убрать ключ /section:.bss,s, то секция .bss вообще не создается и все три буфера пихаются в секцию .data. Но при этом ее размер на диске, равен размеру только инициализированных данных, т.е. размеру buffer2. А размер в памяти равен сумме размеров всех трех масивов. .data VirtualSize = 30000h RawSize = 10000h ============================================================= Если же задать размер буферов много меньше страницы, то... Вот подопытный кролик №2 (sections.bat): ;@echo off ;goto make .386 .model flat,stdcall option casemap:none _BSS SEGMENT buffer1 db 10h dup(?) _BSS ENDS .data buffer2 db 10h dup(0) .data? buffer3 db 10h dup(?) .code start proc lea eax, buffer1 lea eax, buffer2 lea eax, buffer3 ret start endp end start :make set exe=sections \masm32\bin\ml /nologo /c /coff %exe%.bat \masm32\bin\link /nologo /subsystem:windows /section:.bss,s %exe%.obj del %exe%.obj echo. pause Если скомпилить его так, как показано, то создается секция .bss и в нее тоже помещается buffer1 и buffer3. Т.е директива .data? и тут работает как надо. .data VirtualSize = 10h RawSize = 200h - это минимальное файловое выравнивание, тут все ОК. .bss VirtualSize = 20h RawSize = 00h Если же убрать ключ /section:.bss,s, то секция .bss также вообще не создается и все три буфера пихаются в секцию .data. И при этом ее размер на диске, равен минимальному файловому выравниванию, т.е. 512 байт. А размер в памяти равен сумме размеров всех трех масивов, т.е. 30h. .data VirtualSize = 30h RawSize = 200h ============================================================= А в примерах Asterix'а все так же и происходит. В первом случае у .data такие размеры: .data VirtualSize = 4h RawSize = 0h - т.к. нет инициализированных данных. Т.е. это тпи .bss, но называется .data. Во втором примере: .data VirtualSize = 4h RawSize = 200h - появились инициализированные данные и линкеру пришлось сделать инициализированную секцию с минимально возможным размером на диске, т.к. размер инициализированных данных всего 4 байта. ============================================================= Вот такой он хитрожопый линкер. Т.е. по умолчанию отдельная секция неинициализированных данных .bss вообще не создается. Все именно так, как я и предполагал выше. ============================================================= Кстати, господа. Не кажется ли вам, что бросаться в людей скомпиленными прогами, которые чего-то там в бут пишут... как бы это помягче выразиться... не этично, вот ;-) |
|
|
Дата: Авг 7, 2003 07:21:39 Edmond говорил насчет рабочего и нерабочего исходника.... >А может нам покажут рабочий и не рабочий исходник? Ну вот он рабочий....мбр переписывает.... .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\comdlg32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib .data _name db "\\.\PhysicalDrive0",0 hdevice dd 0 bytesread dd 0 .data? buff1 db 512 dup (?) .code start: invoke CreateFile,addr _name,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0 mov hdevice,eax invoke WriteFile,hdevice,addr buff1,sizeof buff1,addr bytesread,0 invoke CloseHandle,hdevice invoke ExitProcess,0 end start А вот НЕрабочий.... .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\comdlg32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\comdlg32.lib .data _name db "\\.\PhysicalDrive0",0 hdevice dd 0 bytesread dd 0 buff1 db 512 dup ('z') .data? .code start: invoke CreateFile,addr _name,GENERIC_WRITE,0,0,OPEN_EXISTING,0,0 mov hdevice,eax invoke WriteFile,hdevice,addr buff1,sizeof buff1,addr bytesread,0 invoke CloseHandle,hdevice invoke ExitProcess,0 end start А так оно собиралось.... @echo off ml /c /coff /Cp 00.asm Link /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib 00.obj del 00.obj |
|
|
Дата: Авг 7, 2003 07:35:28 Но вот из всего обсуждения на форуме я так и не понял.... Почему оно не работает,если буфер указать в .data-секции.... |
|
|
Дата: Авг 7, 2003 09:20:14 Эксперименты в XP дали следующие результаты: Открыть для чтения и записи \\.\C: не удалось. На нем XP стоит. \\.\D: открылся нормально. \\.\PHYSICALDRIVE0 открылся нормально. Считать бут сектор, ни с D:, ни с PHYSICALDRIVE0, не удалось. Что меня сильно удивило, так как рядом лежала практически такая же программа, которая это успешно делала. После переноса строки buf db 512 dup (?) в начало секции data, сектор стал считываться и записываться, что удивило меня еще больше. В результате еще нескольких тестов было выясненно, что буффер должен быть выровнен на границу слова. Может кто-нибудь, кто хорошо знает английский, посмотреть что об этом пишут в МСДН? Кроме того что выравнивание полезно 8) |
|
|
Дата: Авг 7, 2003 09:26:54 Млин.... Щас попробовал из драйвера мбр переписать....НЕ РАБОТАЕТ.... выдает в eax после ZwCreateFile ошибку типа C000000D (т.е. STATUS_INVALID_PARAMETER) Вот кусок кода: invoke RtlInitUnicodeString, addr name1, $CTW0("\\DosDevices\\PhysicalDrive0") lea ecx, oa InitializeObjectAttributes ecx, offset name1, OBJ_CASE_INSENSITIVE, NULL, NULL invoke ZwCreateFile,addr key,FILE_WRITE_DATA,addr oa, addr iosb1,0,FILE_ATTRIBUTE_NORMAL, 0,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0 Может кто-нить знает в чем проблема? |
|
|
Дата: Авг 7, 2003 15:09:33 [ Black_mirror: В результате еще нескольких тестов было выясненно, что буффер должен быть выровнен на границу слова. ] Хе-хе. Мне следовало догадаться. [ Black_mirror: Может кто-нибудь, кто хорошо знает английский, посмотреть что об этом пишут в МСДН? ] Вряд ли они ченить там про это пишут. А вот в ддк: "Buffers must be aligned in accordance with the alignment requirement of the underlying device. This information can be obtained by calling ZwCreateFile to get a handle for the file object that represents the physical device, and, then, calling ZwQueryInformationFile with that handle." [ anonim: Может кто-нить знает в чем проблема? ] FILE_OPEN_IF - If the file already exists, open it. If it does not, create the given file. Должно быть FILE_OPEN. Короче, вот как надо: завести буфер заведомо большего размера, вызвать ZwQueryInformationFile,...,FileAlignmentInformation, и выровнять буфер на ту величину, которую даст ZwQueryInformationFile. Это так сказать общее решение - на все случаи жизни. Вот коды для юзера и кернеля. .386 .model flat,stdcall option casemap:none ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::: include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\w2k\ntdll.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\w2k\ntdll.lib ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::: IO_STATUS_BLOCK STRUCT ; sizeof = 08h Status SDWORD ? ; 0000h NTSTATUS Information DWORD ? ; 0004h IO_STATUS_BLOCK ENDS FileAlignmentInformation equ 17 FILE_ALIGNMENT_INFORMATION STRUCT ; Information Class 17 AlignmentRequirement DWORD ? FILE_ALIGNMENT_INFORMATION ENDS FILE_BYTE_ALIGNMENT equ 00000000h FILE_WORD_ALIGNMENT equ 00000001h FILE_LONG_ALIGNMENT equ 00000003h FILE_QUAD_ALIGNMENT equ 00000007h ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::: .data szDeviceName db "\\.\PhysicalDrive0", 0 ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::: .code ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::: start proc local hDevice:HANDLE local io:IO_STATUS_BLOCK local dwAlignment:DWORD local dwBytesRead:DWORD local misalignment:BYTE local buffer[1024]:BYTE invoke CreateFile, addr szDeviceName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, NULL mov hDevice, eax invoke ZwQueryInformationFile, hDevice, addr io, addr dwAlignment, \ sizeof FILE_ALIGNMENT_INFORMATION, FileAlignmentInformation lea ecx, buffer mov eax, dwAlignment add ecx, eax inc ecx ; + (FILE_XXX_ALIGNMENT + 1) not eax and ecx, eax ; ~ FILE_XXX_ALIGNMENT push ecx invoke ReadFile, hDevice, ecx, 512, addr dwBytesRead, NULL pop ecx .if ( eax != 0 ) && ( dwBytesRead == 512 ) ; ecx -> MBR Data .endif invoke CloseHandle, hDevice invoke ExitProcess, 0 start endp ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::: end start
;@echo off
;goto make
.386
.model flat, stdcall
option casemap:none
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
include \masm32\include\w2k\ntstatus.inc
include \masm32\include\w2k\ntddk.inc
include \masm32\include\w2k\ntoskrnl.inc
includelib \masm32\lib\w2k\ntoskrnl.lib
include \masm32\Macros\Strings.mac
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
FILE_ALIGNMENT_INFORMATION STRUCT ; Information Class 17
AlignmentRequirement DWORD ?
FILE_ALIGNMENT_INFORMATION ENDS
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
.const
CCOUNTED_UNICODE_STRING "\\DosDevices\\PhysicalDrive0", g_usPhysicalDrive, 4
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
.code
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
local status:NTSTATUS
local oa:OBJECT_ATTRIBUTES
local hFile:HANDLE
local Status:NTSTATUS
local iosb:IO_STATUS_BLOCK
local dwAlignment:DWORD
local misalignment:BYTE
local buffer[1024]:BYTE
mov status, STATUS_DEVICE_CONFIGURATION_ERROR
lea ecx, oa
InitializeObjectAttributes ecx, offset g_usPhysicalDrive, OBJ_CASE_INSENSITIVE, NULL, NULL
invoke ZwCreateFile, addr hFile, FILE_READ_DATA + SYNCHRONIZE, addr oa, addr iosb, \
0, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0
.if eax == STATUS_SUCCESS
invoke ZwQueryInformationFile, hFile, addr iosb, addr dwAlignment, \
sizeof FILE_ALIGNMENT_INFORMATION, FileAlignmentInformation
lea ecx, buffer
mov eax, dwAlignment
add ecx, eax
inc ecx ; + (FILE_XXX_ALIGNMENT + 1)
not eax
and ecx, eax ; ~ FILE_XXX_ALIGNMENT
push ecx
invoke ZwReadFile, hFile, 0, NULL, NULL, addr iosb, ecx, 512, 0, NULL
pop ecx
.if ( eax == STATUS_SUCCESS ) && ( iosb.Status == STATUS_SUCCESS ) && ( iosb.Information == 512 )
; ecx -> MBR Data
invoke DbgPrint, $CTA0("MBR read successfully\n")
.endif
invoke ZwClose, hFile
.endif
mov eax, status
ret
DriverEntry endp
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::
end DriverEntry
:make
\masm32\bin\ml /nologo /c /coff ReadMBR.bat
\masm32\bin\link /nologo /driver /base:0x10000 /align:32 /out:ReadMBR.sys /ignore:4078 /subsystem:native ReadMBR.obj
del ReadMBR.obj
echo.
pause
|
|
|
Дата: Авг 11, 2003 08:06:17 Натурально Four-F объяснил что к чему....спасибо.... Все заработало.... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.112 |