· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Проблема с масм

<< . 1 . 2 .

Посл.отвђт Сообщен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 объяснил что к чему....спасибо....
Все заработало....

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.112