[pso] (Win) putk, RtlStringCbPrintfA and Co.
Razvan H
pso@cursuri.cs.pub.ro
Sun, 18 Jul 2004 16:15:45 -0700 (PDT)
Salut.
Alternativa. De ce nu scrii pe debugger in loc sa
scrii in event log?
Un DbgPrint cred ca te-ar ajuta simplu si rapid.
Numai bine,
Razvan
--- Andrei Costin <zveriu_biz@yahoo.com> wrote:
> 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!?
> New and Improved Yahoo! Mail - 100MB free storage!
> http://promotions.yahoo.com/new_mail
> _______________________________________________
> pso mailing list
> pso@cursuri.cs.pub.ro
>
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
>
=====
--------------------------------------------
mindphobia - the fear of thought
I am only what I am who I am at this moment.
--------------------------------------------
__________________________________
Do you Yahoo!?
Vote for the stars of Yahoo!'s next ad campaign!
http://advision.webevents.yahoo.com/yahoo/votelifeengine/