|
|
| Посл.отвђт | Сообщен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 сектор не хочу ;-) А может нам покажут рабочий и не рабочий исходник? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073 |