[pso] [tema1] Logging windows
Andrei Costin
pso@cursuri.cs.pub.ro
Sat, 19 Mar 2005 05:15:27 -0800 (PST)
--0-1849529288-1111238127=:57071
Content-Type: text/plain; charset=us-ascii
mihai sardarescu <mihai_sarda@yahoo.com> wrote:Salut,
Merci de raspuns dar tot nu cred ca am inteles ceea ce trebuie sa fac.
Din ce am citit ar trebui sa fac ceva de genul:
lp = IoAllocateErrorLogEntry(pdriver, SIZE);
if (!lp)
return...;
lp->DumpDataSize = SIZE;
log_packet_data = lp->DumpData;
log_packet_data->syscall_no = syscall;
....
IoWriteErrorLogEntry(lp);
As dori daca poti sa fii un pic mai explicit caci nu inteleg ce trebuie sa tip trebuie sa aiba log_packet_data. Din cate am vazut DumpData este de tipul pointer la ULONG. Cum pot eu atunci sa tin in el un log_packet.
Poate imi scapa ceva.
Salut.
Din motive evidente de fairness, nu pot posta cod explicit.
Deci, SIZE pasat la IoAllocate... trebuie sa tina cont de toate dimensiunile urmatoare:
- dimensiunea IO_ERROR_LOG_PACKET
- dimensiunea unui log_packet care urmeaza a fi inclus in DumpData
- dimensiunea in bytes a argumentelor (efectiv params)
Dupa alocare, setezi lp->DumpDataSize la dimensiunea unui log_packet + dimensiunea in bytes a argumentelor (pentru ca in lp->DumpData vom scrie efectiv un log_packet + argumentele)
Avand acestea, packetul lp arata in memorie cam asa:
--------------------------------------------------------------------------
| IO_ERROR_HEADER | DumpData |
--------------------------------------------------------------------------
< DumpDataSize >
DumpData privit sub microscop arata asa (daca mapam peste DumpData structurile pe care dorim sa le scriem in DumpData)
-------------------------------------------------------------------------------------------------------------
| log_packet.pid | ...... | log_packet.arg[0] | ...... | log_packet.arg[args_nr-1] |
-------------------------------------------------------------------------------------------------------------
Deci, literal vorbind, peste DumpData se "mapeaza" un log_packet.
Acum, daca avem DumpData un pointer, putem sa-l convertim intr-un pointer la log_packet, astfe log_packet_ptr = (struct log_pacjet *) lp->DumpData
Devine evident ca putem accesa acum fiecare camp astfel:
log_packet_ptr->pid
log_packet_ptr->syscall
...
etc
Ca o concluzie - nu trebuie sa aloci explicit memorie pentru un log_packet (se aloca implicit prin IoAllocate... - cu singura conditie ca SIZE dimensiunea unui log_packet, ca altfel nu se va aloca), memorie accesibila incepand de la adresa lp->DumpData
OBS: struct log_packet e putin tricky in sensul ca sizeof(struct log_packet) = sizeof(pid)+sizeof(syscall)+sizeof(syscall_arg_no)+sizeof(syscall_ret) - nu se include si sizeof(syscall_arg[0]) :)! ptr ca e declarat ca tabel cu 0 elemente - e un "work-around" ptr a putea include oricate argumente - intr-o masura oarecare int syscall_arg[0] aloca spatiu pentru un tabel cu dimensiune variabila
Sper ca nu te-am incurcat mai mult.
Bafta
Andrei
---------------------------------
Do you Yahoo!?
Yahoo! Small Business - Try our new resources site!
--0-1849529288-1111238127=:57071
Content-Type: text/html; charset=us-ascii
<DIV><BR><BR><B><I>mihai sardarescu <mihai_sarda@yahoo.com></I></B> wrote:
<BLOCKQUOTE class=replbq style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #1010ff 2px solid">
<DIV>Salut,</DIV>
<DIV>Merci de raspuns dar tot nu cred ca am inteles ceea ce trebuie sa fac.</DIV>
<DIV>Din ce am citit ar trebui sa fac ceva de genul:</DIV>
<DIV>lp = IoAllocateErrorLogEntry(pdriver, SIZE);<BR>if (!lp)<BR> return...;<BR>lp->DumpDataSize = SIZE;<BR>log_packet_data = lp->DumpData;<BR>log_packet_data->syscall_no = syscall;<BR>....<BR>IoWriteErrorLogEntry(lp);</DIV>
<DIV> </DIV>
<DIV>As dori daca poti sa fii un pic mai explicit caci nu inteleg ce trebuie sa tip trebuie sa aiba log_packet_data. Din cate am vazut DumpData este de tipul pointer la ULONG. Cum pot eu atunci sa tin in el un log_packet.</DIV>
<DIV>Poate imi scapa ceva.</DIV>
<DIV> </DIV>
<DIV>Salut.</DIV>
<DIV> </DIV>
<DIV>Din motive evidente de fairness, nu pot posta cod explicit.</DIV>
<DIV> </DIV>
<DIV>Deci, SIZE pasat la IoAllocate... trebuie sa tina cont de toate dimensiunile urmatoare:</DIV>
<DIV> - dimensiunea IO_ERROR_LOG_PACKET</DIV>
<DIV> - dimensiunea unui log_packet care urmeaza a fi inclus in DumpData</DIV>
<DIV> - dimensiunea in bytes a argumentelor (efectiv params)</DIV>
<DIV> </DIV>
<DIV>Dupa alocare, setezi lp->DumpDataSize la dimensiunea unui log_packet + dimensiunea in bytes a argumentelor (pentru ca in lp->DumpData vom scrie efectiv un log_packet + argumentele)</DIV>
<DIV> </DIV>
<DIV>Avand acestea, packetul lp arata in memorie cam asa:</DIV>
<DIV> </DIV>
<DIV>--------------------------------------------------------------------------</DIV>
<DIV>| IO_ERROR_HEADER | DumpData |</DIV>
<DIV>--------------------------------------------------------------------------</DIV>
<DIV> < DumpDataSize ></DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV>DumpData privit sub microscop arata asa (daca mapam peste DumpData structurile pe care dorim sa le scriem in DumpData)</DIV>
<DIV> </DIV>
<DIV>-------------------------------------------------------------------------------------------------------------</DIV>
<DIV>| log_packet.pid | ...... | log_packet.arg[0] | ...... | log_packet.arg[args_nr-1] |</DIV>
<DIV>-------------------------------------------------------------------------------------------------------------</DIV>
<DIV> </DIV>
<DIV>Deci, literal vorbind, peste DumpData se "mapeaza" un log_packet.</DIV>
<DIV> </DIV>
<DIV>Acum, daca avem DumpData un pointer, putem sa-l convertim intr-un pointer la log_packet, astfe log_packet_ptr = (struct log_pacjet *) lp->DumpData</DIV>
<DIV> </DIV>
<DIV>Devine evident ca putem accesa acum fiecare camp astfel:</DIV>
<DIV>log_packet_ptr->pid</DIV>
<DIV>
<DIV>log_packet_ptr->syscall</DIV>
<DIV>...</DIV>
<DIV>etc</DIV>
<DIV> </DIV>
<DIV>Ca o concluzie - nu trebuie sa aloci explicit memorie pentru un log_packet (se aloca implicit prin IoAllocate... - cu singura conditie ca SIZE dimensiunea unui log_packet, ca altfel nu se va aloca), memorie accesibila incepand de la adresa lp->DumpData</DIV>
<DIV> </DIV>
<DIV>OBS: struct log_packet e putin tricky in sensul ca sizeof(struct log_packet) = sizeof(pid)+sizeof(syscall)+sizeof(syscall_arg_no)+sizeof(syscall_ret) - nu se include si sizeof(syscall_arg[0]) :)! ptr ca e declarat ca tabel cu 0 elemente - e un "work-around" ptr a putea include oricate argumente - intr-o masura oarecare int syscall_arg[0] aloca spatiu pentru un tabel cu dimensiune variabila</DIV>
<DIV> </DIV>
<DIV>Sper ca nu te-am incurcat mai mult.</DIV>
<DIV> </DIV>
<DIV>Bafta</DIV>
<DIV> </DIV>
<DIV>Andrei</DIV></DIV></BLOCKQUOTE></DIV><p>
<hr size=1>Do you Yahoo!?<br>
Yahoo! Small Business - <a href="http://us.rd.yahoo.com/evt=31637/*http://smallbusiness.yahoo.com/resources/">Try our new resources site!</a>
--0-1849529288-1111238127=:57071--