· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Проблема с масм

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Авг 6, 2003 07:02:13 · Поправил: Безпощадный даос

такая вот проблема

короче есть код на сях,вот он (запись в бут-сектор):
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
HANDLE hDevice;
DWORD bytesread;
DWORD numberofsectors=1;
DWORD startinglogicalsector=0;
char* buffer=(char*)malloc (512*numberofsectors);
char _devicename[]="\\\\.\\C:";

hDevice=CreateFile(_devicename,GENERIC_WRITE,
          FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
SetFilePointer(hDevice,(startinglogicalsector*512),NULL,FILE_BEGIN);

WriteFile(hDevice,buffer,512*numberofsectors,&bytesread,NULL);
return 0;
}
и этот код отлично работает,т.е. переписывает boot сектор (на нтфс
под вин2000 - лично проверил)

Затем я попытался сделать тоже самое на масме....
и нифига....не работает....то есть файло открывает,пойнтер устанавливает,
а вот при записи в файл ругается,в регистре eax возвращает НОЛЬ....

Вот он код:
.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

.data
_name db "\\.\C:",0
buffer      db 512 dup ('z')

.data?
hdevice     dd ?
bytesread   dd ?

.code
start:
invoke CreateFile,addr _name,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0
mov    hdevice,eax
invoke SetFilePointer,hdevice,0,0,FILE_BEGIN
invoke WriteFile,hdevice,addr buffer,512,addr bytesread,0

invoke ExitProcess,0
end start
Причем что интересно,если в масм-варианте _name db "\\.\C:",0 поменять на _name db "\\.\C:\myfile.txt",0
то все работает,т.е. в C:\myfile.txt оно пишет 512 символов z,а C: не нравится....

Это я что-нить неправильно делаю или масм глючит?


/* примечание модератора - имеет смысл использовать тэг кода */


Дата: Авг 6, 2003 08:44:03

Код вроде точно такой же, попробуй заменить FILE_SHARE_WRITE на 0, и убрать SetFilePointer. Если это не поможет, то сравни в отладчике то, что генерирует Си и масм, может какие-нибудь константы в заголовочных файлах неправильно объявлены.


Дата: Авг 6, 2003 10:54:21

Так пробовал уже (заменить FILE_SHARE_WRITE на 0 и убрать SetFilePointer)....и ничего....тоже самое....масм-вариант не работает....

И в дебаггере смотрел....ну все вроде одно и тоже и константы все теже самые....

Ну не знаю в чем дело может быть....
Хэлп....


Дата: Авг 6, 2003 12:28:28

Просто вуду какое-то ...

Помести асм-код в dllmain добавь туда int3 подключи эту dll к проекту на Си. Можно еще пару раз из Си этот код вызвать(до записи из си и после). А потом в отладчике посмотреть где этот код работает а где нет. Только файл после записи на всякий случай стоит закрыть.


Дата: Авг 6, 2003 12:37:38

Я попытался свой асмовый код вставить в сишный проект....
через
__asm{....}

И тоже....не работает....млин....
Ну я не знаю в чем проблема....
Ткните носом что я не так делаю....


Дата: Авг 6, 2003 13:23:40

Посмотри полуйста работает ли мой код, а то с вин98 каши не сваришь. И еще кинь сюда же оба своих exe, я их дома посмотрю. Только в начало сишного варианта вставь int3.

1392979279__writeboot.zip


Дата: Авг 6, 2003 13:25:26

Попробуй убрать неинициализированные данные.


Дата: Авг 6, 2003 14:14:22

anonim
Во первых - я не понял где у Вас возникла ошибка?
.code 
start: 
invoke CreateFile,addr _name,GENERIC_WRITE,FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0 

;; ЗДЕСЬ? 

mov hdevice,eax 
invoke SetFilePointer,hdevice,0,0,FILE_BEGIN 

;; ЗДЕСЬ?

invoke WriteFile,hdevice,addr buffer,512,addr bytesread,0 


Или где?

Явнях ошибок не видно. Но я по себе знаю, как легко тупануть в этих функциях.


Дата: Авг 6, 2003 14:28:20

Странно. Ты же понимаешь, что если на чистом апи написано, то что на с, что на асме, код будет одинаковый. К тому же здесь все настолько просто, что... Повторить я это не могу по причине отсутствия нтфс. Попробуй для начала вызвать GetLastError. Потом внимательно сравни код в дизассемблере. Потом пройди в отладчике. В конце концов зайди внутрь WriteFile и посмотри, что ей конкретно не нравится.


Дата: Авг 6, 2003 14:36:09

Four-F
Да, жаль у меня MSDN не ставится :((
У меня такое чувство, что снова где-то дряная ошибка из-за перепутывания указателей и переменных.
Вот например 512?
Что разве в мануале так? Хотя я не помню :(


Дата: Авг 6, 2003 15:48:55

Нашел я глюк....но честно слово ОБЪЯСНИТЕ МНЕ ПОЧЕМУ ОНО ТАК? А сам я не понимаю....

Короче нужно было буфер,который пишем на винт указывать в секции .data?,а не в секции .data

И все заработало....
Но почему?


Дата: Авг 6, 2003 15:53:12

Four-F
Странно. Ты же понимаешь, что если на чистом апи написано, то что на с, что на асме, код будет одинаковый. К тому же здесь все настолько просто, что... Повторить я это не могу по причине отсутствия нтфс

А оно и на фат32 под вин2000/икспипи тоже не работало....
Так что если у тя на компе есть нечто нтшное,то можешь проверить мой код,файловая система не имеет значения....


Дата: Авг 6, 2003 16:09:35

anonim
Гм... Тонкости RTL :)
Four-F ты не встречал такого?


Дата: Авг 6, 2003 16:30:03

[ anonim: Короче нужно было буфер,который пишем на винт указывать в секции .data?,а не в секции .data ]

Погоди-ка, погоди.

Во-первых, если у тя твои данные, кот. ты на винт писАть хочешь, будут в секции .data?, то как ты их инициализируешь? Во время выполнения проги копируешь туда? Инициализировать прямо в исходнике не получится.

Во-вторых, линкер генерит всего одну секцию .data и сваливает туда все, что в исходнике было помечено как .data и как .data?.
Т.е. от того, что ты переместил буфер под директиву .data? вообще ничего не изменилось. Уэтой единственной секции все равно есть атрибут readable.

Чудеса какие-то или я дундук... Не, тут, чего-то не то.

Между прочим, твои исходники принципиально отличаются, тем, что в сишном буфер выделяется в куче, с помощью malloc. Этот буфер иициализирован нулями. В масмовом исходнике буфер у тя в секции .data и иициализирован буковками 'z'. Если ты говоришь, что переместил его под .data?, то линкер все равно иициализирует его нулями, даже если у тя там и 'z' прописано. И он (линкер) должен еще ругнуться примерно вот так:

warning A4014: instructions and initialized data not supported in BSS segments

В общем, я лично не очень понимаю, без оригинальных исходников, что происходит. Но поганить свой boot сектор не хочу ;-)


Дата: Авг 6, 2003 16:40:29

Four-F
Ну во первых бут поганить не обязательно. Можно и в файл записать.
А во вторых...
Если ты говоришь, что переместил его под .data?, то линкер все равно иициализирует его нулями

Кто тебе такое сказал?
А разве память не выделяется динамически?

В общем, я лично не очень понимаю, без оригинальных исходников, что происходит. Но поганить свой boot сектор не хочу ;-)

А может нам покажут рабочий и не рабочий исходник?

. 1 . 2 . >>


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