Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

Openclos.c

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 1999 - 2003
00003  * NetGroup, Politecnico di Torino (Italy)
00004  * All rights reserved.
00005  *
00006  * Redistribution and use in source and binary forms, with or without
00007  * modification, are permitted provided that the following conditions
00008  * are met:
00009  *
00010  * 1. Redistributions of source code must retain the above copyright
00011  * notice, this list of conditions and the following disclaimer.
00012  * 2. Redistributions in binary form must reproduce the above copyright
00013  * notice, this list of conditions and the following disclaimer in the
00014  * documentation and/or other materials provided with the distribution.
00015  * 3. Neither the name of the Politecnico di Torino nor the names of its
00016  * contributors may be used to endorse or promote products derived from
00017  * this software without specific prior written permission.
00018  *
00019  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00020  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00021  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00022  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00023  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00024  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00025  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00026  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00027  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00028  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00029  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030  *
00031  */
00032 
00033 #include "ntddk.h"
00034 #include "ntiologc.h"
00035 #include "ndis.h"
00036 
00037 #include "debug.h"
00038 #include "packet.h"
00039 
00040 static NDIS_MEDIUM MediumArray[] = {
00041     NdisMedium802_3,
00042 //  NdisMediumWan,
00043     NdisMediumFddi,
00044     NdisMediumArcnet878_2,
00045     NdisMediumAtm,
00046     NdisMedium802_5
00047 };
00048 
00049 #define NUM_NDIS_MEDIA  (sizeof MediumArray / sizeof MediumArray[0])
00050 
00051 ULONG NamedEventsCounter=0;
00052 
00053 //Itoa. Replaces the buggy RtlIntegerToUnicodeString
00054 void PacketItoa(UINT n,PUCHAR buf){
00055 int i;
00056 
00057     for(i=0;i<20;i+=2){
00058         buf[18-i]=(n%10)+48;
00059         buf[19-i]=0;
00060         n/=10;
00061     }
00062 
00063 }
00064 
00066 struct time_conv G_Start_Time = {
00067     0,  
00068     {0, 0}, 
00069 };
00070 
00071 UINT n_Opened_Instances = 0;
00072 
00073 NDIS_SPIN_LOCK Opened_Instances_Lock;
00074 
00075 //-------------------------------------------------------------------
00076 
00077 NTSTATUS NPF_Open(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
00078 {
00079 
00080     PDEVICE_EXTENSION DeviceExtension;
00081 
00082     POPEN_INSTANCE    Open;
00083 
00084     PIO_STACK_LOCATION  IrpSp;
00085 
00086     NDIS_STATUS     Status;
00087     NDIS_STATUS     ErrorStatus;
00088     UINT            i;
00089     PUCHAR          tpointer;
00090     PLIST_ENTRY     PacketListEntry;
00091     PCHAR           EvName;
00092 
00093     IF_LOUD(DbgPrint("NPF: OpenAdapter\n");)
00094 
00095     DeviceExtension = DeviceObject->DeviceExtension;
00096 
00097     IrpSp = IoGetCurrentIrpStackLocation(Irp);
00098 
00099     //  allocate some memory for the open structure
00100     Open=ExAllocatePoolWithTag(NonPagedPool, sizeof(OPEN_INSTANCE), '0OWA');
00101 
00102     if (Open==NULL) {
00103         // no memory
00104         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
00105         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00106         return STATUS_INSUFFICIENT_RESOURCES;
00107     }
00108 
00109     RtlZeroMemory(
00110         Open,
00111         sizeof(OPEN_INSTANCE)
00112         );
00113 
00114 
00115     EvName=ExAllocatePoolWithTag(NonPagedPool, sizeof(L"\\BaseNamedObjects\\NPF0000000000"), '1OWA');
00116 
00117     if (EvName==NULL) {
00118         // no memory
00119         ExFreePool(Open);
00120         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
00121         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00122         return STATUS_INSUFFICIENT_RESOURCES;
00123     }
00124 
00125     //  Save or open here
00126     IrpSp->FileObject->FsContext=Open;
00127     
00128     Open->DeviceExtension=DeviceExtension;
00129     
00130     
00131     //  Save the Irp here for the completeion routine to retrieve
00132     Open->OpenCloseIrp=Irp;
00133     
00134     //  Allocate a packet pool for our xmit and receive packets
00135     NdisAllocatePacketPool(
00136         &Status,
00137         &Open->PacketPool,
00138         TRANSMIT_PACKETS,
00139         sizeof(PACKET_RESERVED));
00140     
00141     
00142     if (Status != NDIS_STATUS_SUCCESS) {
00143         
00144         IF_LOUD(DbgPrint("NPF: Failed to allocate packet pool\n");)
00145             
00146         ExFreePool(Open);
00147         ExFreePool(EvName);
00148         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
00149         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00150         return STATUS_INSUFFICIENT_RESOURCES;
00151     }
00152 
00153 
00154     RtlCopyBytes(EvName,L"\\BaseNamedObjects\\NPF0000000000",sizeof(L"\\BaseNamedObjects\\NPF0000000000"));
00155 
00156     //Create the string containing the name of the read event
00157     RtlInitUnicodeString(&Open->ReadEventName,(PCWSTR) EvName);
00158 
00159     PacketItoa(NamedEventsCounter,(PUCHAR)(Open->ReadEventName.Buffer+21));
00160 
00161     InterlockedIncrement(&NamedEventsCounter);
00162     
00163     IF_LOUD(DbgPrint("\nCreated the named event for the read; name=%ws, counter=%d\n", Open->ReadEventName.Buffer,NamedEventsCounter-1);)
00164 
00165     //allocate the event objects
00166     Open->ReadEvent=IoCreateNotificationEvent(&Open->ReadEventName,&Open->ReadEventHandle);
00167     if(Open->ReadEvent==NULL){
00168         ExFreePool(Open);
00169         ExFreePool(EvName);
00170         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
00171         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00172         return STATUS_INSUFFICIENT_RESOURCES;
00173     }
00174     
00175     KeInitializeEvent(Open->ReadEvent, NotificationEvent, FALSE);
00176     KeClearEvent(Open->ReadEvent);
00177     NdisInitializeEvent(&Open->WriteEvent);
00178     NdisInitializeEvent(&Open->IOEvent);
00179     NdisInitializeEvent(&Open->DumpEvent);
00180     NdisInitializeEvent(&Open->IOEvent);
00181     NdisAllocateSpinLock(&Open->MachineLock);
00182     NdisAllocateSpinLock(&Open->WriteLock);
00183     Open->WriteInProgress = FALSE;
00184 
00185     //  list to hold irp's want to reset the adapter
00186     InitializeListHead(&Open->ResetIrpList);
00187     
00188     
00189     //  Initialize the request list
00190     KeInitializeSpinLock(&Open->RequestSpinLock);
00191     InitializeListHead(&Open->RequestList);
00192 
00193     // Initializes the extended memory of the NPF machine
00194     Open->mem_ex.buffer = ExAllocatePoolWithTag(NonPagedPool, DEFAULT_MEM_EX_SIZE, '2OWA');
00195     if((Open->mem_ex.buffer) == NULL)
00196     {
00197         // no memory
00198         ExFreePool(Open);
00199         ExFreePool(EvName);
00200         Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
00201         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00202         return STATUS_INSUFFICIENT_RESOURCES;
00203     }
00204     
00205     Open->mem_ex.size = DEFAULT_MEM_EX_SIZE;
00206     RtlZeroMemory(Open->mem_ex.buffer, DEFAULT_MEM_EX_SIZE);
00207     
00208     //
00209     // Initialize the open instance
00210     //
00211 //  Open->BufSize = 0;
00212 //  Open->Buffer = NULL;
00213 //  Open->Bhead = 0;
00214 //  Open->Btail = 0;
00215 //  (INT)Open->BLastByte = -1;
00216 //  Open->Dropped = 0;      //reset the dropped packets counter
00217 //  Open->Received = 0;     //reset the received packets counter
00218 //  Open->Accepted = 0;     //reset the accepted packets counter
00219     Open->bpfprogram = NULL;    //reset the filter
00220     Open->mode = MODE_CAPT;
00221     Open->Nbytes.QuadPart = 0;
00222     Open->Npackets.QuadPart = 0;
00223     Open->Nwrites = 1;
00224     Open->Multiple_Write_Counter = 0;
00225     Open->MinToCopy = 0;
00226     Open->TimeOut.QuadPart = (LONGLONG)1;
00227     Open->Bound = TRUE;
00228     Open->DumpFileName.Buffer = NULL;
00229     Open->DumpFileHandle = NULL;
00230     Open->tme.active = TME_NONE_ACTIVE;
00231     Open->DumpLimitReached = FALSE;
00232     Open->MaxFrameSize = 0;
00233     Open->WriterSN=0;
00234     Open->ReaderSN=0;
00235     Open->Size=0;
00236 
00237 
00238 
00239     //allocate the spinlock for the statistic counters
00240     NdisAllocateSpinLock(&Open->CountersLock);
00241 
00242     //allocate the spinlock for the buffer pointers
00243     //    NdisAllocateSpinLock(&Open->BufLock);
00244     
00245     //
00246     //  link up the request stored in our open block
00247     //
00248     for (i=0;i<MAX_REQUESTS;i++) {
00249         ExInterlockedInsertTailList(
00250             &Open->RequestList,
00251             &Open->Requests[i].ListElement,
00252             &Open->RequestSpinLock);
00253         
00254     }
00255     
00256 
00257     IoMarkIrpPending(Irp);
00258     
00259     //
00260     //  Try to open the MAC
00261     //
00262     IF_LOUD(DbgPrint("NPF: Openinig the device %ws, BindingContext=%d\n",DeviceExtension->AdapterName.Buffer, Open);)
00263 
00264     NdisOpenAdapter(
00265         &Status,
00266         &ErrorStatus,
00267         &Open->AdapterHandle,
00268         &Open->Medium,
00269         MediumArray,
00270         NUM_NDIS_MEDIA,
00271         DeviceExtension->NdisProtocolHandle,
00272         Open,
00273         &DeviceExtension->AdapterName,
00274         0,
00275         NULL);
00276 
00277     IF_LOUD(DbgPrint("NPF: Opened the device, Status=%x\n",Status);)
00278 
00279     if (Status != NDIS_STATUS_PENDING)
00280     {
00281         NPF_OpenAdapterComplete(Open,Status,NDIS_STATUS_SUCCESS);
00282     }
00283     
00284     return(STATUS_PENDING);
00285 }
00286 
00287 //-------------------------------------------------------------------
00288 
00289 VOID NPF_OpenAdapterComplete(
00290     IN NDIS_HANDLE  ProtocolBindingContext,
00291     IN NDIS_STATUS  Status,
00292     IN NDIS_STATUS  OpenErrorStatus)
00293 {
00294 
00295     PIRP                Irp;
00296     POPEN_INSTANCE      Open;
00297     PLIST_ENTRY         RequestListEntry;
00298     PINTERNAL_REQUEST   MaxSizeReq;
00299     NDIS_STATUS         ReqStatus;
00300 
00301 
00302     IF_LOUD(DbgPrint("NPF: OpenAdapterComplete\n");)
00303 
00304     Open= (POPEN_INSTANCE)ProtocolBindingContext;
00305 
00306     //
00307     //  get the open irp
00308     //
00309     Irp=Open->OpenCloseIrp;
00310 
00311     if (Status != NDIS_STATUS_SUCCESS) {
00312 
00313         IF_LOUD(DbgPrint("NPF: OpenAdapterComplete-FAILURE\n");)
00314 
00315         NdisFreePacketPool(Open->PacketPool);
00316 
00317         //free mem_ex
00318         Open->mem_ex.size = 0;
00319         if(Open->mem_ex.buffer != NULL)ExFreePool(Open->mem_ex.buffer);
00320 
00321         ExFreePool(Open->ReadEventName.Buffer);
00322 
00323         ZwClose(Open->ReadEventHandle);
00324 
00325 
00326         ExFreePool(Open);
00327     }
00328     else {
00329         NdisAcquireSpinLock(&Opened_Instances_Lock);
00330         n_Opened_Instances++;
00331         NdisReleaseSpinLock(&Opened_Instances_Lock);
00332         
00333         IF_LOUD(DbgPrint("Opened Instances:%d", n_Opened_Instances);)
00334 
00335         // Get the absolute value of the system boot time.
00336         // This is used for timestamp conversion.
00337         TIME_SYNCHRONIZE(&G_Start_Time);
00338 
00339         // Extract a request from the list of free ones
00340         RequestListEntry=ExInterlockedRemoveHeadList(&Open->RequestList, &Open->RequestSpinLock);
00341 
00342         if (RequestListEntry == NULL)
00343         {
00344 
00345             Open->MaxFrameSize = 1514;  // Assume Ethernet
00346 
00347             Irp->IoStatus.Status = Status;
00348             Irp->IoStatus.Information = 0;
00349             IoCompleteRequest(Irp, IO_NO_INCREMENT);
00350 
00351             return;
00352         }
00353 
00354         MaxSizeReq = CONTAINING_RECORD(RequestListEntry, INTERNAL_REQUEST, ListElement);
00355         MaxSizeReq->Irp = Irp;
00356         MaxSizeReq->Internal = TRUE;
00357 
00358         
00359         MaxSizeReq->Request.RequestType = NdisRequestQueryInformation;
00360         MaxSizeReq->Request.DATA.QUERY_INFORMATION.Oid = OID_GEN_MAXIMUM_TOTAL_SIZE;
00361 
00362         
00363         MaxSizeReq->Request.DATA.QUERY_INFORMATION.InformationBuffer = &Open->MaxFrameSize;
00364         MaxSizeReq->Request.DATA.QUERY_INFORMATION.InformationBufferLength = 4;
00365 
00366         //  submit the request
00367         NdisRequest(
00368             &ReqStatus,
00369             Open->AdapterHandle,
00370             &MaxSizeReq->Request);
00371 
00372 
00373         if (ReqStatus != NDIS_STATUS_PENDING) {
00374             NPF_RequestComplete(Open, &MaxSizeReq->Request, ReqStatus);
00375         }
00376 
00377         return;
00378 
00379     }
00380 
00381     Irp->IoStatus.Status = Status;
00382     Irp->IoStatus.Information = 0;
00383     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00384 
00385     return;
00386 
00387 }
00388 
00389 //-------------------------------------------------------------------
00390 
00391 NTSTATUS
00392 NPF_Close(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
00393 {
00394 
00395     POPEN_INSTANCE    Open;
00396     NDIS_STATUS     Status;
00397     PIO_STACK_LOCATION  IrpSp;
00398     LARGE_INTEGER ThreadDelay;
00399 
00400     IF_LOUD(DbgPrint("NPF: CloseAdapter\n");)
00401 
00402     IrpSp = IoGetCurrentIrpStackLocation(Irp);
00403 
00404     Open=IrpSp->FileObject->FsContext;
00405 
00406     // Reset the buffer size. This tells the dump thread to stop.
00407 //  Open->BufSize = 0;
00408 
00409     if( Open->Bound == FALSE){
00410 
00411         NdisWaitEvent(&Open->IOEvent,10000);
00412 
00413         // Free the filter if it's present
00414         if(Open->bpfprogram != NULL)
00415             ExFreePool(Open->bpfprogram);
00416 
00417         // Free the jitted filter if it's present
00418         if(Open->Filter != NULL)
00419             BPF_Destroy_JIT_Filter(Open->Filter);
00420 
00421         //free the buffer
00422 //      Open->BufSize=0;
00423 //      if(Open->Buffer != NULL)ExFreePool(Open->Buffer);
00424 
00425         if (Open->Size > 0)
00426             ExFreePool(Open->CpuData[0].Buffer);
00427     
00428         //free mem_ex
00429         Open->mem_ex.size = 0;
00430         if(Open->mem_ex.buffer != NULL)ExFreePool(Open->mem_ex.buffer);
00431                 
00432         NdisFreePacketPool(Open->PacketPool);
00433 
00434         // Free the string with the name of the dump file
00435         if(Open->DumpFileName.Buffer!=NULL)
00436             ExFreePool(Open->DumpFileName.Buffer);
00437             
00438         ExFreePool(Open->ReadEventName.Buffer);
00439         ExFreePool(Open);
00440 
00441         Irp->IoStatus.Information = 0;
00442         Irp->IoStatus.Status = STATUS_SUCCESS;
00443         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00444         
00445         return(STATUS_SUCCESS);
00446     }
00447 
00448     // Unfreeze the consumer
00449     if(Open->mode & MODE_DUMP)
00450         NdisSetEvent(&Open->DumpEvent);
00451     else
00452         KeSetEvent(Open->ReadEvent,0,FALSE);
00453 
00454     // Save the IRP
00455     Open->OpenCloseIrp = Irp;
00456 
00457     IoMarkIrpPending(Irp);
00458  
00459     // If this instance is in dump mode, complete the dump and close the file
00460     if((Open->mode & MODE_DUMP) && Open->DumpFileHandle != NULL){
00461 
00462         NTSTATUS wres;
00463 
00464         ThreadDelay.QuadPart = -50000000;
00465         // Wait the completion of the thread
00466         wres = KeWaitForSingleObject(Open->DumpThreadObject,
00467                 UserRequest,
00468                 KernelMode,
00469                 TRUE,
00470                 &ThreadDelay);
00471 
00472         ObDereferenceObject(Open->DumpThreadObject);
00473 
00474 
00475         // Flush and close the dump file
00476         NPF_CloseDumpFile(Open);
00477     }
00478 
00479     // Destroy the read Event
00480     ZwClose(Open->ReadEventHandle);
00481 
00482     // Close the adapter
00483     NdisCloseAdapter(
00484         &Status,
00485         Open->AdapterHandle
00486         );
00487 
00488     if (Status != NDIS_STATUS_PENDING) {
00489         
00490         NPF_CloseAdapterComplete(
00491             Open,
00492             Status
00493             );
00494         return STATUS_SUCCESS;
00495         
00496     }
00497     
00498     return(STATUS_PENDING);
00499 }
00500 
00501 //-------------------------------------------------------------------
00502 
00503 VOID
00504 NPF_CloseAdapterComplete(IN NDIS_HANDLE  ProtocolBindingContext,IN NDIS_STATUS  Status)
00505 {
00506     POPEN_INSTANCE    Open;
00507     PIRP              Irp;
00508 
00509     IF_LOUD(DbgPrint("NPF: CloseAdapterComplete\n");)
00510 
00511     Open= (POPEN_INSTANCE)ProtocolBindingContext;
00512 
00513     // free the allocated structures only if the instance is still bound to the adapter
00514     if(Open->Bound == TRUE){
00515         
00516         // Free the filter if it's present
00517         if(Open->bpfprogram != NULL)
00518             ExFreePool(Open->bpfprogram);
00519 
00520         // Free the jitted filter if it's present
00521         if(Open->Filter != NULL)
00522             BPF_Destroy_JIT_Filter(Open->Filter);
00523         
00524         //free the buffer
00525 //      Open->BufSize = 0;
00526 //      if(Open->Buffer!=NULL)ExFreePool(Open->Buffer);
00527         
00528         if (Open->Size > 0)
00529             ExFreePool(Open->CpuData[0].Buffer);
00530 
00531         //free mem_ex
00532         Open->mem_ex.size = 0;
00533         if(Open->mem_ex.buffer != NULL)ExFreePool(Open->mem_ex.buffer);
00534         
00535         NdisFreePacketPool(Open->PacketPool);
00536         
00537         Irp=Open->OpenCloseIrp;
00538         
00539         // Free the string with the name of the dump file
00540         if(Open->DumpFileName.Buffer!=NULL)
00541             ExFreePool(Open->DumpFileName.Buffer);
00542 
00543         ExFreePool(Open->ReadEventName.Buffer);
00544         ExFreePool(Open);
00545         
00546         // Complete the request only if the instance is still bound to the adapter
00547         Irp->IoStatus.Status = STATUS_SUCCESS;
00548         Irp->IoStatus.Information = 0;
00549         IoCompleteRequest(Irp, IO_NO_INCREMENT);
00550     }
00551     else
00552         NdisSetEvent(&Open->IOEvent);
00553 
00554     // Decrease the counter of open instances
00555     NdisAcquireSpinLock(&Opened_Instances_Lock);
00556     n_Opened_Instances--;
00557     NdisReleaseSpinLock(&Opened_Instances_Lock);
00558 
00559     IF_LOUD(DbgPrint("Opened Instances:%d", n_Opened_Instances);)
00560 
00561     if(n_Opened_Instances == 0){
00562         // Force a synchronization at the next NPF_Open().
00563         // This hopefully avoids the synchronization issues caused by hibernation or standby.
00564         TIME_DESYNCHRONIZE(&G_Start_Time);
00565     }
00566 
00567     return;
00568 
00569 }
00570 //-------------------------------------------------------------------
00571 
00572 #ifdef NDIS50
00573 NDIS_STATUS
00574 NPF_PowerChange(IN NDIS_HANDLE ProtocolBindingContext, IN PNET_PNP_EVENT pNetPnPEvent)
00575 {
00576     IF_LOUD(DbgPrint("NPF: PowerChange\n");)
00577 
00578     TIME_DESYNCHRONIZE(&G_Start_Time);
00579 
00580     TIME_SYNCHRONIZE(&G_Start_Time);
00581 
00582     return STATUS_SUCCESS;
00583 }
00584 #endif
00585 
00586 //-------------------------------------------------------------------
00587 
00588 VOID
00589 NPF_BindAdapter(
00590     OUT PNDIS_STATUS            Status,
00591     IN  NDIS_HANDLE             BindContext,
00592     IN  PNDIS_STRING            DeviceName,
00593     IN  PVOID                   SystemSpecific1,
00594     IN  PVOID                   SystemSpecific2
00595     )
00596 {
00597     IF_LOUD(DbgPrint("NPF: NPF_BindAdapter\n");)
00598 }
00599 
00600 //-------------------------------------------------------------------
00601 
00602 VOID
00603 NPF_UnbindAdapter(
00604     OUT PNDIS_STATUS        Status,
00605     IN  NDIS_HANDLE         ProtocolBindingContext,
00606     IN  NDIS_HANDLE         UnbindContext
00607     )
00608 {
00609     POPEN_INSTANCE   Open =(POPEN_INSTANCE)ProtocolBindingContext;
00610     NDIS_STATUS      lStatus;
00611 
00612     IF_LOUD(DbgPrint("NPF: NPF_UnbindAdapter\n");)
00613 
00614     // Reset the buffer size. This tells the dump thread to stop.
00615 //  Open->BufSize=0;
00616 
00617     NdisResetEvent(&Open->IOEvent);
00618 
00619     // This open instance is no more bound to the adapter, set Bound to False
00620     InterlockedExchange( (PLONG) &Open->Bound, FALSE );
00621 
00622     // Awake a possible pending read on this instance
00623     if(Open->mode & MODE_DUMP)
00624         NdisSetEvent(&Open->DumpEvent);
00625     else
00626         KeSetEvent(Open->ReadEvent,0,FALSE);
00627 
00628     // If this instance is in dump mode, complete the dump and close the file
00629     if((Open->mode & MODE_DUMP) && Open->DumpFileHandle != NULL)
00630         NPF_CloseDumpFile(Open);
00631 
00632     // Destroy the read Event
00633     ZwClose(Open->ReadEventHandle);
00634 
00635     //  close the adapter
00636     NdisCloseAdapter(
00637         &lStatus,
00638         Open->AdapterHandle
00639         );
00640 
00641     if (lStatus != NDIS_STATUS_PENDING) {
00642 
00643         NPF_CloseAdapterComplete(
00644             Open,
00645             lStatus
00646             );
00647 
00648         *Status = NDIS_STATUS_SUCCESS;
00649         return;
00650 
00651     }
00652 
00653     *Status = NDIS_STATUS_SUCCESS;
00654     return;
00655 }
00656 
00657 //-------------------------------------------------------------------
00658 
00659 VOID
00660 NPF_ResetComplete(IN NDIS_HANDLE  ProtocolBindingContext,IN NDIS_STATUS  Status)
00661 
00662 {
00663     POPEN_INSTANCE      Open;
00664     PIRP                Irp;
00665 
00666     PLIST_ENTRY         ResetListEntry;
00667 
00668     IF_LOUD(DbgPrint("NPF: PacketResetComplte\n");)
00669 
00670     Open= (POPEN_INSTANCE)ProtocolBindingContext;
00671 
00672 
00673     //
00674     //  remove the reset IRP from the list
00675     //
00676     ResetListEntry=ExInterlockedRemoveHeadList(
00677                        &Open->ResetIrpList,
00678                        &Open->RequestSpinLock
00679                        );
00680 
00681 #if DBG
00682     if (ResetListEntry == NULL) {
00683         DbgBreakPoint();
00684         return;
00685     }
00686 #endif
00687 
00688     Irp=CONTAINING_RECORD(ResetListEntry,IRP,Tail.Overlay.ListEntry);
00689 
00690     Irp->IoStatus.Status = STATUS_SUCCESS;
00691     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00692 
00693     IF_LOUD(DbgPrint("NPF: PacketResetComplte exit\n");)
00694 
00695     return;
00696 
00697 }

documentation. Copyright (c) 2002-2003 Politecnico di Torino. All rights reserved.