Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
eXeL@B —› Программирование —› ASM вставки в Delphi |
Посл.ответ | Сообщение |
|
Создано: 23 марта 2007 22:17 · Личное сообщение · #1 Такой код: asm push 0 push 0 push 10003000h push 0 push 10003004h push 0 push 0 push 0 call GetVolumeInformationA mov eax,10003000h mov ebx,10003004h mov eax,dword ptr ds:[eax] mov ebx,dword ptr ds:[ebx] xor eax,21350921h rol eax,3 xor eax,ebx ror ebx,3 mov [res],eax end; edit1.Text:=IntToHex(res,8); Ошибка вываливается в mov eax,dword ptr ds:[eax], под оллей пишет такое: ds:[10003000]=??? eax=10003000 Хотя в рабочей dll выдает: ds:[10003000]=000700FF eax=10003000 А если заменить mov eax,dword ptr ds:[eax] на mov eax,000700FFh, то все нормально, но вскакивает ошибка здесь edit1.Text:=IntToHex(res,8);. Кто знает в чем ошибка, подскажите. ----- xchg dword [eax], eax |
|
Создано: 23 марта 2007 22:24 · Поправил: s0larian · Личное сообщение · #2 бегом на http_://msdn.microsoft.com
Аргументы которые ты посылаешь - кривые. Например - самый последний push должен содержать указатель на lpRootPathName: [in] A pointer to a string that contains the root directory of the volume to be described. If this parameter is NULL, the root of the current directory is used. A trailing backslash is required. For example, you would specify \\MyServer\MyShare as \\MyServer\MyShare\, or the C drive as "C:\". |
|
Создано: 23 марта 2007 22:45 · Личное сообщение · #3 v0id2k пишет: А если заменить mov eax,dword ptr ds:[eax] на mov eax,000700FFh, то все нормально, но вскакивает ошибка здесь edit1.Text:=IntToHex(res,8);. Нужно явно указать предка TEdit, т.к возможно при вызове твоего ASM кода Handle TEditBox затирается, и поэтому возкикает ошибка доступа к памяти. напиши так: Form1.edit1.Text := IntToHex( res, 8 ) и все отработает нормально. |
|
Создано: 23 марта 2007 22:53 · Личное сообщение · #4 |
|
Создано: 23 марта 2007 23:27 · Личное сообщение · #5 v0id2k пишет: ds:[10003000]=??? eax=10003000 от куда такие адресса? перевадай переменные блин! асм код, бери в рамки pushad/popad ты же как вставку юзаешь, зачем усложнять себе жизнь? да и вообще можно было АПИ заюзать! Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String; Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean; implementation function GetDisks(TypeOfDisk : Word) : String;{Получить имена нужных дисков} var DriveArray : array[1..26] of Char; I : integer; begin DriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ'; for I := 1 to 26 do if GetDriveType(PChar(DriveArray[I]+':')) = TypeOfDisk then Result := Result+DriveArray[I]; end; Function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName : String; Var VolumeSerialNo, MaxComponentLength, FileSystemFlags:LongWord) : Boolean; Var _VolumeName,_FileSystemName:array [0..MAX_PATH-1] of Char; _VolumeSerialNo,_MaxComponentLength,_FileSystemFlags:LongWord; Begin if GetVolumeInformation(PChar(Disk+':'),_VolumeName,MAX_PATH,@_VolumeSeri alNo, _MaxComponentLength,_FileSystemFlags,_FileSystemName,MAX_PATH) then Begin VolumeName:=_VolumeName; VolumeSerialNo:=_VolumeSerialNo; MaxComponentLength:=_MaxComponentLength; FileSystemFlags:=_FileSystemFlags; FileSystemName:=_FileSystemName; Result:=True; End else Result:=False; End; end. ----- [nice coder and reverser] |
|
Создано: 23 марта 2007 23:28 · Поправил: s0larian · Личное сообщение · #6 |
|
Создано: 23 марта 2007 23:48 · Поправил: v0id2k · Личное сообщение · #7 Hellspawn Эти адреса из Olly. Просто получить ID диска С в этом нет проблем, как видишь в АСМ вставке присутствует это: mov eax,10003000h mov ebx,10003004h mov eax,dword ptr ds:[eax] mov ebx,dword ptr ds:[ebx] xor eax,21350921h rol eax,3 xor eax,ebx ror ebx,3 Как организовать xor средствами Делфи я конечно знаю, но rol и ror понятия не имею. Если сохранять регистры(pushad/popad), прога с тем же ексепшеном вылетает(mov eax,dword ptr ds:[eax]) s0larian На Делфи набросал: function GetNum: string; var VolumeSerialNo : DWord; MaxComponentLength,FileSystemFlags:cardinal; begin VolumeSerialNo:=10003004; FileSystemFlags:=10003000; GetVolumeInformation('c:',0,0,@VolumeSerialNo,MaxComponentLength,FileS ystemFlags,0,0); result:=copy(inttohex(VolumeSerialNo,8),1,4); end; Функция работает, как я понял в АСМ вставке у меня последний параметр тупит, это параметр lpRootPathName. Хоть циры верные вставляю все равно не пашет(push 00450458h(это 'c:')). ----- xchg dword [eax], eax |
|
Создано: 24 марта 2007 00:02 · Личное сообщение · #8 |
|
Создано: 24 марта 2007 01:22 · Личное сообщение · #9 s0larian Я понял, дело не в передаваемых параметрах. mov eax,10003000h <- косяк здесь mov ebx,10003004h <- и здесь mov eax,dword ptr ds:[eax] mov ebx,dword ptr ds:[ebx] Заранее в регистры EAX и EBX мы помещаем адреса, а командой mov eax,dword ptr ds:[eax] мы пытаемся в регистр EAX поместить DWORD по адресу [eax], т.е. по адресу 10003000h, а у меня в файле нет такого адреса, вот он и ругается, придестя по другому переписывать. Спасибо всем за ответы! ----- xchg dword [eax], eax |
|
Создано: 24 марта 2007 09:29 · Личное сообщение · #10 На пробуй unit Unit1;
|
|
Создано: 24 марта 2007 16:45 · Личное сообщение · #11 Veliant Спасибо. Но я уже нашел ошибку: v0id2k пишет: Заранее в регистры EAX и EBX мы помещаем адреса, а командой mov eax,dword ptr ds:[eax] мы пытаемся в регистр EAX поместить DWORD по адресу [eax], т.е. по адресу 10003000h, а у меня в файле нет такого адреса, вот он и ругается ----- xchg dword [eax], eax |
|
Создано: 24 марта 2007 16:48 · Личное сообщение · #12 |
eXeL@B —› Программирование —› ASM вставки в Delphi |
Эта тема закрыта. Ответы больше не принимаются. |