1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS NDIS User I/O driver
4  * FILE:        createclose.c
5  * PURPOSE:     IRP_MJ_CREATE and IRP_MJ_CLOSE handling
6  * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
7  */
8 
9 #include "ndisuio.h"
10 
11 //#define NDEBUG
12 #include <debug.h>
13 
14 NTSTATUS
15 NTAPI
16 NduDispatchCreate(PDEVICE_OBJECT DeviceObject,
17                   PIRP Irp)
18 {
19     PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
20 
21     ASSERT(DeviceObject == GlobalDeviceObject);
22 
23     DPRINT("Created file object 0x%x\n", IrpSp->FileObject);
24 
25     /* This is associated with an adapter during IOCTL_NDISUIO_OPEN_(WRITE_)DEVICE */
26     IrpSp->FileObject->FsContext = NULL;
27     IrpSp->FileObject->FsContext2 = NULL;
28 
29     /* Completed successfully */
30     Irp->IoStatus.Status = STATUS_SUCCESS;
31     Irp->IoStatus.Information = FILE_OPENED;
32     IoCompleteRequest(Irp, IO_NO_INCREMENT);
33 
34     /* Return success */
35     return STATUS_SUCCESS;
36 }
37 
38 NTSTATUS
39 NTAPI
40 NduDispatchClose(PDEVICE_OBJECT DeviceObject,
41                  PIRP Irp)
42 {
43     PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
44     PNDISUIO_ADAPTER_CONTEXT AdapterContext = IrpSp->FileObject->FsContext;
45     PNDISUIO_OPEN_ENTRY OpenEntry = IrpSp->FileObject->FsContext2;
46 
47     ASSERT(DeviceObject == GlobalDeviceObject);
48 
49     DPRINT("Closing file object 0x%x\n", IrpSp->FileObject);
50 
51     /* Check if this handle was ever associated with an adapter */
52     if (AdapterContext != NULL)
53     {
54         ASSERT(OpenEntry != NULL);
55 
56         DPRINT("Removing binding to adapter %wZ\n", &AdapterContext->DeviceName);
57 
58         /* Call the our helper */
59         DereferenceAdapterContextWithOpenEntry(AdapterContext, OpenEntry);
60     }
61 
62     /* Completed */
63     Irp->IoStatus.Status = STATUS_SUCCESS;
64     Irp->IoStatus.Information = 0;
65     IoCompleteRequest(Irp, IO_NO_INCREMENT);
66 
67     /* Return success */
68     return STATUS_SUCCESS;
69 }
70