[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 &lt;mihai_sarda@yahoo.com&gt;</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>&nbsp;&nbsp; return...;<BR>lp-&gt;DumpDataSize = SIZE;<BR>log_packet_data = lp-&gt;DumpData;<BR>log_packet_data-&gt;syscall_no = syscall;<BR>....<BR>IoWriteErrorLogEntry(lp);</DIV>
<DIV>&nbsp;</DIV>
<DIV>As dori daca poti sa fii un pic mai explicit caci nu inteleg ce trebuie sa&nbsp;tip trebuie sa aiba&nbsp;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>&nbsp;</DIV>
<DIV>Salut.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Din motive evidente de fairness, nu pot posta cod explicit.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Deci,&nbsp;SIZE pasat la IoAllocate... trebuie sa tina cont de toate dimensiunile urmatoare:</DIV>
<DIV>&nbsp;- dimensiunea IO_ERROR_LOG_PACKET</DIV>
<DIV>&nbsp;- dimensiunea unui log_packet care urmeaza a fi inclus in DumpData</DIV>
<DIV>&nbsp;- dimensiunea in bytes a&nbsp;argumentelor (efectiv params)</DIV>
<DIV>&nbsp;</DIV>
<DIV>Dupa alocare, setezi lp-&gt;DumpDataSize la dimensiunea unui log_packet + dimensiunea in bytes a argumentelor (pentru ca in lp-&gt;DumpData vom scrie efectiv un log_packet + argumentele)</DIV>
<DIV>&nbsp;</DIV>
<DIV>Avand acestea, packetul lp arata in memorie cam asa:</DIV>
<DIV>&nbsp;</DIV>
<DIV>--------------------------------------------------------------------------</DIV>
<DIV>| IO_ERROR_HEADER |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DumpData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</DIV>
<DIV>--------------------------------------------------------------------------</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DumpDataSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>DumpData privit sub microscop arata asa (daca mapam peste DumpData structurile pe care dorim sa le scriem in DumpData)</DIV>
<DIV>&nbsp;</DIV>
<DIV>-------------------------------------------------------------------------------------------------------------</DIV>
<DIV>| log_packet.pid | ......&nbsp;| log_packet.arg[0] | ...... | log_packet.arg[args_nr-1] |</DIV>
<DIV>-------------------------------------------------------------------------------------------------------------</DIV>
<DIV>&nbsp;</DIV>
<DIV>Deci, literal vorbind, peste DumpData se "mapeaza" un log_packet.</DIV>
<DIV>&nbsp;</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-&gt;DumpData</DIV>
<DIV>&nbsp;</DIV>
<DIV>Devine evident ca putem accesa acum fiecare camp astfel:</DIV>
<DIV>log_packet_ptr-&gt;pid</DIV>
<DIV>
<DIV>log_packet_ptr-&gt;syscall</DIV>
<DIV>...</DIV>
<DIV>etc</DIV>
<DIV>&nbsp;</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-&gt;DumpData</DIV>
<DIV>&nbsp;</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>&nbsp;</DIV>
<DIV>Sper ca nu te-am incurcat mai mult.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Bafta</DIV>
<DIV>&nbsp;</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--