Prost Delfi vapros
7 отговора
220 прегледа
Prost Delfi vapros
Znachi - iskam da pro4eta 14B ot adres 0000:EC80 naprimer. Kak stawa towa s Delfi? Niakoi ako moje da mi dade prost primer?
Отг: Prost Delfi vapros
Ами въпроса наистина е прост ама за нещастие отговора е доста сложен: Ако си запознат с на4ина на менажиране на паметта при разли4ните системи и по специално за достъпа до паметта от програма ще знаеш 4е много малко (нищожно малко - ДОС и Win9x - последната не за всичко са тази които аз познавам) системи позволяват подобни волности - всяка програма разполага със собствена памет - "виртуална" - т.е. тя не е свързана с определен физи4ески адрес от паметта. Така 4е пипането на адрес от паметта на прогрмата няма да доведе до пипане на съответния ФИЗИЧЕСКИ АДРЕС в паметта - най-много до GPF или Аccess violation. За да няма объркване в "сериозните" системи подобни пипания на паметта са разрешени само на ниво драйвер и в определен режим на ядрото. В кратце - за да направиш такова нещо ти трябва да си напишеш драйвер. Имам нещо подобно което работи за портовете под 9х и NT на Delphi ама не съм сигурен дали ще ти свърши работа. Taka 4e ako ти е толково сериозна работата - а не само за да се базикаш пусни един маил за да ти го пратя.
Въпроса ти не е прост.....,но ето ти едни пример
Ето как да прочетеш 8 байта от паметта, ти сам си го направи за колкото искаш:
Var
B_Info: Array Of Byte;
i: Integer;
Begin
SetLength(B_Info, 8);
Asm
XOR ECX, ECX
MOV EBX, DWORD Ptr [B_Info]
@M1: MOV EAX, DWord Ptr [000FAAA6H + ECX]
MOV DWORD Ptr [EBX + ECX], EAX
ADD ECX, 04D
CMP ECX, 08D
JNE @M1
End;
End;
чете от адрес 000FAAA6H,
CMP ECX, 08D <- промени брои байтове за да прочете повече от 8
SetLength(B_Info, 8); <- промени също и тук брои байтове
08D - е дестетчно, можеш да въведеш колкото си искаш
Редактирано от Shveik на 23.01.01 19:38.
Adjamia_anon
Благодаря ви и на двамата. И особено на асемблерския код на Shveik. С малка корекция - работи.
Ставаше дума дали Delphi предлага някакви подобни директни функции за работа с паметта, като тези в Turbo Pascal - mem[xxxx : xxxx] и memw[xxxx : xxxx]. Защото четох разни "пълни" ръководства, четох и Help-а, ама такова нещо не открих. И явно такива няма.
Иначе, системата е точно Windows 9х и не смятам да си правя бъзици, нито да записвам нещо във физическата памет. А пък и точно тия адреси май са RO.
Конкретно преди време запитах за т.нар. "номер на дъното". Тогава ми отговори Shveik с алгоритъм много подобен на тоя, т.е. на асемблер и за четене на BIOS-датата на FFFF5, който адрес го знам, но и тогава не ми беше ясно как се чете с Object Pascal. Първо - аз не знам въобще какъв е тоя номер - на BIOS ли, на CPU ли, на какво, но според мен по "дъното" има бая схеми и нищо чудно всяка от тях да си има номер. После пък, като си разглеждах BIOS-програмата, намерих една любопитна графа - Product Data, с две още по - любопитни полета - System Board Identifier (11B) и System Serial Number (7B). В края - не съм хич запознат с мениджмънта на паметта, но при един dump тия стойности в обратен ред ги открих съответно на адреси FFFB6 и FFFBB. Целта ми беше да си направя програмка, която да ги чете от там и записва в обикновен текстов файл, за да мога да сравня данните от различни компютри. Получи се като изключим, че с asm-функцията чета 24 вместо 18B, защото доколкото ми стигат познанията, тя чете само в буфери кратни на 4. Не е болка за умиране.
Единственото, което ми е известно е, че областта F0000-FFFFF е резервирана за BIOS. Така, че ако някой от вас знае нещо повече за Identifier i Number (Shveik каза, че не знае) и му остане време да провери какво е положението на компютъра си, ще му бъда благодарен.
Ставаше дума дали Delphi предлага някакви подобни директни функции за работа с паметта, като тези в Turbo Pascal - mem[xxxx : xxxx] и memw[xxxx : xxxx]. Защото четох разни "пълни" ръководства, четох и Help-а, ама такова нещо не открих. И явно такива няма.
Иначе, системата е точно Windows 9х и не смятам да си правя бъзици, нито да записвам нещо във физическата памет. А пък и точно тия адреси май са RO.
Конкретно преди време запитах за т.нар. "номер на дъното". Тогава ми отговори Shveik с алгоритъм много подобен на тоя, т.е. на асемблер и за четене на BIOS-датата на FFFF5, който адрес го знам, но и тогава не ми беше ясно как се чете с Object Pascal. Първо - аз не знам въобще какъв е тоя номер - на BIOS ли, на CPU ли, на какво, но според мен по "дъното" има бая схеми и нищо чудно всяка от тях да си има номер. После пък, като си разглеждах BIOS-програмата, намерих една любопитна графа - Product Data, с две още по - любопитни полета - System Board Identifier (11B) и System Serial Number (7B). В края - не съм хич запознат с мениджмънта на паметта, но при един dump тия стойности в обратен ред ги открих съответно на адреси FFFB6 и FFFBB. Целта ми беше да си направя програмка, която да ги чете от там и записва в обикновен текстов файл, за да мога да сравня данните от различни компютри. Получи се като изключим, че с asm-функцията чета 24 вместо 18B, защото доколкото ми стигат познанията, тя чете само в буфери кратни на 4. Не е болка за умиране.
Единственото, което ми е известно е, че областта F0000-FFFFF е резервирана за BIOS. Така, че ако някой от вас знае нещо повече за Identifier i Number (Shveik каза, че не знае) и му остане време да провери какво е положението на компютъра си, ще му бъда благодарен.
А може ли да ми обясни някой?
Значи:
program BINFO;
{$APPTYPE CONSOLE}
uses Windows;
const ExtCode = 'Shveik_posting.txt';
var FHandle: Integer;
Wr: Longword;
Inf: string;
B: BOOL;
function GetInfo: string; external ExtCode name 'BIOSDate';
begin
Inf:=GetInfo;
FHandle:= CreateFile(PChar('BINFO.TXT'), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if FHandle < 0 then
WriteLn('Error creating.')
else
begin
B:=WriteFile(FHandle,Pointer(Inf)^,18,Wr,nil);
if not B then WriteLn('Error writing.');
B:=CloseHandle(FHandle);
if B then WriteLn('Successful.')
else WriteLn('Error closing.');
end;
WriteLn(' Press <Enter>...');
ReadLn;
end.
Това под 95 работи. Под NT - почти. Отваря конзолния прозорец и веднага го затваря, а binfo.txt се създава, но с дължина 0. Защо?
program BINFO;
{$APPTYPE CONSOLE}
uses Windows;
const ExtCode = 'Shveik_posting.txt';
var FHandle: Integer;
Wr: Longword;
Inf: string;
B: BOOL;
function GetInfo: string; external ExtCode name 'BIOSDate';
begin
Inf:=GetInfo;
FHandle:= CreateFile(PChar('BINFO.TXT'), GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if FHandle < 0 then
WriteLn('Error creating.')
else
begin
B:=WriteFile(FHandle,Pointer(Inf)^,18,Wr,nil);
if not B then WriteLn('Error writing.');
B:=CloseHandle(FHandle);
if B then WriteLn('Successful.')
else WriteLn('Error closing.');
end;
WriteLn(' Press <Enter>...');
ReadLn;
end.
Това под 95 работи. Под NT - почти. Отваря конзолния прозорец и веднага го затваря, а binfo.txt се създава, но с дължина 0. Защо?
Re: А може ли да ми обясни някой?
Just For Info
HANDLE CreateFile(
LPCTSTR lpFileName, // file name
DWORD dwDesiredAccess, // access mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
);
Win NT/2000
Nachi ako LPSECURITY_ATTRIBUTES e NULL faila poluchava security descriptor po podrazbirane.
osventova vmesto da sravnqvash FHANDLE < 0 polzvai
if (FHANDLE = INVALID_HANDLE_VALUE)
writefile vryshta 0 ako e uspql ... proverqvai go
sled writefile
B:=FlushFileBuffers(FHANDLE)
chak sled tova closehandle
i nakraq
DWORD GetLastError(VOID);
ti dava informaciq podrobna za vyzniknalata greshka.
Imai v predvid che NTFS se polzvat Stream-ove /pogledni v MSDN-a ako ti e podryka/
4ao
HANDLE CreateFile(
LPCTSTR lpFileName, // file name
DWORD dwDesiredAccess, // access mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
);
Win NT/2000
Nachi ako LPSECURITY_ATTRIBUTES e NULL faila poluchava security descriptor po podrazbirane.
osventova vmesto da sravnqvash FHANDLE < 0 polzvai
if (FHANDLE = INVALID_HANDLE_VALUE)
writefile vryshta 0 ako e uspql ... proverqvai go
sled writefile
B:=FlushFileBuffers(FHANDLE)
chak sled tova closehandle
i nakraq
DWORD GetLastError(VOID);
ti dava informaciq podrobna za vyzniknalata greshka.
Imai v predvid che NTFS se polzvat Stream-ove /pogledni v MSDN-a ako ti e podryka/
4ao
Re: А може ли да ми обясни някой?
predishniqt mi posting e malko pribyrzan :))
nqmam predstava kakvo pravi getInfo :)
(qvno problema e tam)
taka che please ignore it
rgrdz bofh
nqmam predstava kakvo pravi getInfo :)
(qvno problema e tam)
taka che please ignore it
rgrdz bofh