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