[pso] (Win) putk, RtlStringCbPrintfA and Co.
Andrei Costin
pso@cursuri.cs.pub.ro
Sun, 18 Jul 2004 07:48:56 -0700 (PDT)
Salut :).
Sper ca mai este cineva "alive" pe grup si poate sa ma ajute.
So, am urmatoarele:
- driverul in sine are scopul doar sa trimita spre vizualizare in EventViewer
RegistryPath-ul (cheia de registru) asociat driver-ului
- in DriverEntry primesc al doilea parametru PUNICODE_STRING RegistryPath
- pentru a ma familiariza cu String-urile si functiile pentru String-uri din Rtl am
dorit sa trimit
in loguri folosind putk() intregul string desemnat de RegistryPath (in cazul meu,
driverul se
numeste temp.sys iar RegistryPath are continutul
"\REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\temp" adica cam ce si era de
asteptat,un string
de ANSI Length=52 bytes si UNICODE Length=104 bytes respectiv)
- am o copie a acestui RegistryPath sub forma de ANSI_STRING in variabila "a" (am
optat si
ptr o copie ANSI pentru ca putk() primeste al treilea parametru "const char *")
- am o variabila "char *" numita "str", folosita in functia "RtlStringCbPrintfA()",
echivalentul
SAFE (#include <ntstrsafe.h>) pentru "sprintf()"
"str" e alocata astfel "str = (char *) ExAllocatePoolWithTag(NonPagedPool, 256,
MEMTAG);"
- o secventa de genul imi merge perfect:
stat = RtlStringCbPrintfA(str, 256, "A Max=%ld, Len=%ld", a.MaximumLength,
a.Length);
if (!NT_SUCCESS(stat)) {
// tratez eroarea
return ...
}
putk(driver, EVENTLOG_INFO, str);
- o secventa de genul urmator imi da BSOD (Bug Check) la apelul putk():
stat = RtlStringCbPrintfA(str, 256, "%s", a.Buffer);
if (!NT_SUCCESS(stat)) {
// tratez eroarea
return ...
}
putk(driver, EVENTLOG_INFO, str);
- similar, daca am o secventa de genul:
for (i=0; i<a.Length; i++) {
stat = RtlStringCbPrintfA(str, 256, "%c", (int)(a.Buffer[i]));
if (!NT_SUCCESS(stat)) {
// tratez eroarea
return ...
}
putk(driver, EVENTLOG_INFO, str);
}
atunci imi crapa cu BSOD din cauza lui putk() (fara putk() ciclul merge perfect),
iar daca
conditia lui for() e modificata in "i<a.Length-10" ciclul merge si cu putk(), si mi
se
afiseaza RegistryPath-ul caracter cu caracter, mai putin ultimele zece caractere
deci banuiesc ca "RtlStringCbPrintfA()" merge totusi ok.
- BSODul e un Bug Check-ul :
0x0000001E (0x00000005, 0xFCA57356, 0x00000001, 0x0000000C)
KMODE_EXCEPTION_NOT_HANDLED
so ce anume imi genereaza exceptie?! :(
Intrebari:
- sa fie cumva putk() de vina? oricum am impresia ca ceva ii lipseste lui putk()
pentru ca am
vazut exemple de ErrorLogging in care dupa p=IoAllocateErrorLogEntry(), se verifica if
(!p){return...}
- din cite am inteles lungimea unui log packet e limitata la parca 152 bytes, insa cu
siguranta
cind apelez putk(driver, EVENTLOG_INFO, str) am strlen(str)=52, deci nu prea cred ca e
o eroare
de alocare
- ok, sa zicem ca in cazul de mai sus ar fi o eroare de alocare, de ce atunci 42 de
apeluri la
rind pentru putk() merg iar 52 deja genereaza exceptie?! :(
Multumesc anticipat pentru raspunsuri.
Best regards & respect,
Andrei Costin
_______________________________
Manifest - ".MD - My Domain!"
__________________________________
Do you Yahoo!?
Vote for the stars of Yahoo!'s next ad campaign!
http://advision.webevents.yahoo.com/yahoo/votelifeengine/