[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/