ReactOS  0.4.15-dev-1171-gab82533
ioctl.c File Reference
#include "ndisuio.h"
#include <debug.h>
Include dependency graph for ioctl.c:

Go to the source code of this file.

Functions

static NTSTATUS WaitForBind (PIRP Irp, PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS QueryBinding (PIRP Irp, PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS SetAdapterOid (PIRP Irp, PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS QueryAdapterOid (PIRP Irp, PIO_STACK_LOCATION IrpSp)
 
static NTSTATUS OpenDeviceReadWrite (PIRP Irp, PIO_STACK_LOCATION IrpSp)
 
NTSTATUS NTAPI NduDispatchDeviceControl (PDEVICE_OBJECT DeviceObject, PIRP Irp)
 

Function Documentation

◆ NduDispatchDeviceControl()

NTSTATUS NTAPI NduDispatchDeviceControl ( PDEVICE_OBJECT  DeviceObject,
PIRP  Irp 
)

Definition at line 469 of file ioctl.c.

471 {
473  PNDISUIO_OPEN_ENTRY OpenEntry;
474 
476 
477  /* Handle open IOCTLs first */
478  switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
479  {
481  return OpenDeviceReadWrite(Irp, IrpSp);
482 #if 0
483  case IOCTL_NDISUIO_OPEN_WRITE_DEVICE:
484  return OpenDeviceWrite(Irp, IrpSp);
485 #endif
487  return WaitForBind(Irp, IrpSp);
488 
490  return QueryBinding(Irp, IrpSp);
491 
492  default:
493  /* Fail if this file object has no adapter associated */
494  if (IrpSp->FileObject->FsContext == NULL)
495  {
496  Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
497  Irp->IoStatus.Information = 0;
499 
501  }
502 
503  /* Now handle write IOCTLs */
504  switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
505  {
507  return SetAdapterOid(Irp, IrpSp);
508 
509  default:
510  /* Check that we have read permissions */
511  OpenEntry = IrpSp->FileObject->FsContext2;
512  if (OpenEntry->WriteOnly)
513  {
514  Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
515  Irp->IoStatus.Information = 0;
517 
519  }
520 
521  switch (IrpSp->Parameters.DeviceIoControl.IoControlCode)
522  {
523 #if 0
524  case IOCTL_CANCEL_READ:
525  return CancelPacketRead(Irp, IrpSp);
526 #endif
527 
529  return QueryAdapterOid(Irp, IrpSp);
530 
531  default:
532  DPRINT1("Unimplemented\n");
533  Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
534  Irp->IoStatus.Information = 0;
536  return STATUS_NOT_IMPLEMENTED;
537  }
538  }
539  break;
540  }
541 }
static NTSTATUS QueryBinding(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: ioctl.c:34
#define IOCTL_NDISUIO_BIND_WAIT
Definition: nuiouser.h:27
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
#define IOCTL_NDISUIO_QUERY_OID_VALUE
Definition: nuiouser.h:16
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
static NTSTATUS WaitForBind(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: ioctl.c:16
static NTSTATUS OpenDeviceReadWrite(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: ioctl.c:294
static NTSTATUS SetAdapterOid(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: ioctl.c:146
#define IOCTL_NDISUIO_QUERY_BINDING
Definition: nuiouser.h:23
Definition: ndisuio.h:53
smooth NULL
Definition: ftsmooth.c:416
#define IoCompleteRequest
Definition: irp.c:1240
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
PDEVICE_OBJECT GlobalDeviceObject
Definition: main.c:14
#define IOCTL_NDISUIO_SET_OID_VALUE
Definition: nuiouser.h:31
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2789
PFILE_OBJECT FileObject
Definition: iotypes.h:3148
BOOLEAN WriteOnly
Definition: ndisuio.h:59
static NTSTATUS QueryAdapterOid(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: ioctl.c:220
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
_In_ PDEVICE_OBJECT DeviceObject
Definition: iotypes.h:2464
#define DPRINT1
Definition: precomp.h:8
#define IOCTL_NDISUIO_OPEN_DEVICE
Definition: nuiouser.h:12
#define IO_NO_INCREMENT
Definition: iotypes.h:581
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3107

Referenced by DriverEntry().

◆ OpenDeviceReadWrite()

static NTSTATUS OpenDeviceReadWrite ( PIRP  Irp,
PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 294 of file ioctl.c.

295 {
298  ULONG NameLength;
300  PNDISUIO_ADAPTER_CONTEXT AdapterContext;
301  PNDISUIO_OPEN_ENTRY OpenEntry;
302  KIRQL OldIrql;
303 
304  NameLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
305  if (NameLength != 0)
306  {
307  DeviceName.MaximumLength = DeviceName.Length = NameLength;
308  DeviceName.Buffer = Irp->AssociatedIrp.SystemBuffer;
309 
310  /* Check if this already has a context */
311  AdapterContext = FindAdapterContextByName(&DeviceName);
312  if (AdapterContext != NULL)
313  {
314  DPRINT("Binding file object 0x%x to device %wZ\n", FileObject, &AdapterContext->DeviceName);
315 
316  /* Reference the adapter context */
317  KeAcquireSpinLock(&AdapterContext->Spinlock, &OldIrql);
318  if (AdapterContext->OpenCount != 0)
319  {
320  /* An open for read-write is exclusive,
321  * so we can't have any other open handles */
322  KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql);
324  }
325  else
326  {
327  /* Add a reference */
328  ReferenceAdapterContext(AdapterContext);
330  }
331  }
332  else
333  {
334  /* Invalid device name */
336  }
337 
338  /* Check that the bind succeeded */
339  if (NT_SUCCESS(Status))
340  {
341  OpenEntry = ExAllocatePool(NonPagedPool, sizeof(*OpenEntry));
342  if (OpenEntry)
343  {
344  /* Set the file object pointer */
345  OpenEntry->FileObject = FileObject;
346 
347  /* Set the permissions */
348  OpenEntry->WriteOnly = FALSE;
349 
350  /* Associate this FO with the adapter */
351  FileObject->FsContext = AdapterContext;
352  FileObject->FsContext2 = OpenEntry;
353 
354  /* Add it to the adapter's list */
355  InsertTailList(&AdapterContext->OpenEntryList,
356  &OpenEntry->ListEntry);
357 
358  /* Success */
359  KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql);
361  }
362  else
363  {
364  /* Remove the reference we added */
365  KeReleaseSpinLock(&AdapterContext->Spinlock, OldIrql);
368  }
369  }
370  }
371  else
372  {
373  /* Invalid device name */
375  }
376 
377  Irp->IoStatus.Status = Status;
378  Irp->IoStatus.Information = 0;
379 
381 
382  return Status;
383 }
VOID DereferenceAdapterContextWithOpenEntry(PNDISUIO_ADAPTER_CONTEXT AdapterContext, PNDISUIO_OPEN_ENTRY OpenEntry)
Definition: misc.c:149
PNDISUIO_ADAPTER_CONTEXT FindAdapterContextByName(PNDIS_STRING DeviceName)
Definition: misc.c:115
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
KSPIN_LOCK Spinlock
Definition: ndisuio.h:50
WCHAR DeviceName[]
Definition: adapter.cpp:21
#define InsertTailList(ListHead, Entry)
VOID ReferenceAdapterContext(PNDISUIO_ADAPTER_CONTEXT AdapterContext)
Definition: misc.c:142
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define FALSE
Definition: types.h:117
Definition: ndisuio.h:53
smooth NULL
Definition: ftsmooth.c:416
#define IoCompleteRequest
Definition: irp.c:1240
void DPRINT(...)
Definition: polytest.cpp:61
_Inout_ PFILE_OBJECT FileObject
Definition: cdprocs.h:588
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
* PFILE_OBJECT
Definition: iotypes.h:1978
PFILE_OBJECT FileObject
Definition: ndisuio.h:56
UNICODE_STRING DeviceName
Definition: ndisuio.h:44
Status
Definition: gdiplustypes.h:24
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:790
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
PFILE_OBJECT FileObject
Definition: iotypes.h:3148
BOOLEAN WriteOnly
Definition: ndisuio.h:59
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
LIST_ENTRY ListEntry
Definition: ndisuio.h:62
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581
LIST_ENTRY OpenEntryList
Definition: ndisuio.h:30
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3107
return STATUS_SUCCESS
Definition: btrfs.c:3014

Referenced by NduDispatchDeviceControl().

◆ QueryAdapterOid()

static NTSTATUS QueryAdapterOid ( PIRP  Irp,
PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 220 of file ioctl.c.

221 {
222  PNDISUIO_ADAPTER_CONTEXT AdapterContext = IrpSp->FileObject->FsContext;
223  PNDISUIO_QUERY_OID QueryOidRequest;
225  ULONG RequestLength;
227 
228  Irp->IoStatus.Information = 0;
229 
230  QueryOidRequest = Irp->AssociatedIrp.SystemBuffer;
231  RequestLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
232  if (QueryOidRequest && RequestLength >= sizeof(NDIS_OID))
233  {
234  /* Setup the NDIS request */
235  Request.RequestType = NdisRequestQueryInformation;
236  Request.DATA.QUERY_INFORMATION.Oid = QueryOidRequest->Oid;
237  Request.DATA.QUERY_INFORMATION.InformationBufferLength = RequestLength - sizeof(NDIS_OID);
238  if (Request.DATA.QUERY_INFORMATION.InformationBufferLength != 0)
239  {
240  Request.DATA.QUERY_INFORMATION.InformationBuffer = QueryOidRequest->Data;
241  }
242  else
243  {
244  Request.DATA.QUERY_INFORMATION.InformationBuffer = NULL;
245  }
246  Request.DATA.QUERY_INFORMATION.BytesWritten = 0;
247 
248  DPRINT("Querying OID 0x%x on adapter %wZ\n", QueryOidRequest->Oid, &AdapterContext->DeviceName);
249 
250  /* Dispatch the request */
252  AdapterContext->BindingHandle,
253  &Request);
254 
255  /* Wait for the request */
257  {
258  KeWaitForSingleObject(&AdapterContext->AsyncEvent,
259  Executive,
260  KernelMode,
261  FALSE,
262  NULL);
263  Status = AdapterContext->AsyncStatus;
264  }
265 
266  /* Return the bytes written */
269  {
271  }
272  else if (Status == NDIS_STATUS_SUCCESS)
273  {
274  Irp->IoStatus.Information = sizeof(NDIS_OID) + Request.DATA.QUERY_INFORMATION.BytesWritten;
275  }
276 
277  DPRINT("Final request status: 0x%x (%d)\n", Status, Irp->IoStatus.Information);
278  }
279  else
280  {
281  /* Bad parameters */
283  }
284 
285  Irp->IoStatus.Status = Status;
286 
288 
289  return Status;
290 }
_In_opt_ NDIS_HANDLE _In_opt_ NDIS_HANDLE _Inout_ PNDIS_REQUEST NdisRequest
Definition: ndis.h:1571
_In_ WDFREQUEST Request
Definition: cdrom.h:1234
#define NDIS_STATUS_PENDING
Definition: ndis.h:347
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
ULONG NDIS_OID
Definition: ntddndis.h:230
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
int NDIS_STATUS
Definition: ntddndis.h:471
#define FALSE
Definition: types.h:117
#define NDIS_STATUS_BUFFER_TOO_SHORT
Definition: ndis.h:487
smooth NULL
Definition: ftsmooth.c:416
#define NDIS_STATUS_INVALID_LENGTH
Definition: ndis.h:485
#define IoCompleteRequest
Definition: irp.c:1240
void DPRINT(...)
Definition: polytest.cpp:61
UNICODE_STRING DeviceName
Definition: ndisuio.h:44
NDIS_STATUS AsyncStatus
Definition: ndisuio.h:22
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
Status
Definition: gdiplustypes.h:24
PFILE_OBJECT FileObject
Definition: iotypes.h:3148
NDIS_HANDLE BindingHandle
Definition: ndisuio.h:26
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
UCHAR Data[sizeof(ULONG)]
Definition: nuiouser.h:38
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3107
NDIS_OID Oid
Definition: nuiouser.h:37

Referenced by NduDispatchDeviceControl().

◆ QueryBinding()

static NTSTATUS QueryBinding ( PIRP  Irp,
PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 34 of file ioctl.c.

35 {
36  PNDISUIO_ADAPTER_CONTEXT AdapterContext = NULL;
37  PNDISUIO_QUERY_BINDING QueryBinding = Irp->AssociatedIrp.SystemBuffer;
38  ULONG BindingLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
40  PLIST_ENTRY CurrentEntry;
41  KIRQL OldIrql;
42  ULONG i;
43  ULONG BytesCopied = 0;
44 
45  if (QueryBinding && BindingLength >= sizeof(NDISUIO_QUERY_BINDING))
46  {
48  i = 0;
49  CurrentEntry = GlobalAdapterList.Flink;
50  while (CurrentEntry != &GlobalAdapterList)
51  {
52  if (i == QueryBinding->BindingIndex)
53  {
54  AdapterContext = CONTAINING_RECORD(CurrentEntry, NDISUIO_ADAPTER_CONTEXT, ListEntry);
55  break;
56  }
57  i++;
58  CurrentEntry = CurrentEntry->Flink;
59  }
61  if (AdapterContext)
62  {
63  DPRINT("Query binding for index %d is adapter %wZ\n", i, &AdapterContext->DeviceName);
65  if (AdapterContext->DeviceName.Length <= BindingLength - BytesCopied)
66  {
67  QueryBinding->DeviceNameOffset = BytesCopied;
68  QueryBinding->DeviceNameLength = AdapterContext->DeviceName.Length;
69  RtlCopyMemory((PUCHAR)QueryBinding + QueryBinding->DeviceNameOffset,
70  AdapterContext->DeviceName.Buffer,
71  QueryBinding->DeviceNameLength);
72  BytesCopied += AdapterContext->DeviceName.Length;
73 
74  /* FIXME: Copy description too */
75  QueryBinding->DeviceDescrOffset = BytesCopied;
76  QueryBinding->DeviceDescrLength = 0;
77 
78  /* Successful */
80  }
81  else
82  {
83  /* Not enough buffer space */
85  }
86  }
87  else
88  {
89  /* Invalid index */
91  }
92  }
93  else
94  {
95  /* Invalid parameters */
97  }
98 
99  Irp->IoStatus.Status = Status;
100  Irp->IoStatus.Information = BytesCopied;
101 
103 
104  return Status;
105 }
static NTSTATUS QueryBinding(PIRP Irp, PIO_STACK_LOCATION IrpSp)
Definition: ioctl.c:34
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define STATUS_NO_MORE_ENTRIES
Definition: ntstatus.h:205
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
unsigned char * PUCHAR
Definition: retypes.h:3
LONG NTSTATUS
Definition: precomp.h:26
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
UCHAR KIRQL
Definition: env_spec_w32.h:591
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
struct _NDISUIO_QUERY_BINDING NDISUIO_QUERY_BINDING
_In_ UINT _In_ UINT _In_ PNDIS_PACKET _In_ UINT _Out_ PUINT BytesCopied
Definition: ndis.h:3167
smooth NULL
Definition: ftsmooth.c:416
#define IoCompleteRequest
Definition: irp.c:1240
void DPRINT(...)
Definition: polytest.cpp:61
KSPIN_LOCK GlobalAdapterListLock
Definition: main.c:16
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
UNICODE_STRING DeviceName
Definition: ndisuio.h:44
Status
Definition: gdiplustypes.h:24
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:790
Definition: typedefs.h:119
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
LIST_ENTRY GlobalAdapterList
Definition: main.c:17
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3107
return STATUS_SUCCESS
Definition: btrfs.c:3014

Referenced by NduDispatchDeviceControl(), and OpenAdapterHandle().

◆ SetAdapterOid()

static NTSTATUS SetAdapterOid ( PIRP  Irp,
PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 146 of file ioctl.c.

147 {
148  PNDISUIO_ADAPTER_CONTEXT AdapterContext = IrpSp->FileObject->FsContext;
149  PNDISUIO_SET_OID SetOidRequest;
151  ULONG RequestLength;
153 
154  Irp->IoStatus.Information = 0;
155 
156  SetOidRequest = Irp->AssociatedIrp.SystemBuffer;
157  RequestLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
158  if (SetOidRequest && RequestLength >= sizeof(NDIS_OID))
159  {
160  /* Setup the NDIS request */
161  Request.RequestType = NdisRequestSetInformation;
162  Request.DATA.SET_INFORMATION.Oid = SetOidRequest->Oid;
163  Request.DATA.SET_INFORMATION.InformationBufferLength = RequestLength - sizeof(NDIS_OID);
164  if (Request.DATA.SET_INFORMATION.InformationBufferLength != 0)
165  {
166  Request.DATA.SET_INFORMATION.InformationBuffer = SetOidRequest->Data;
167  }
168  else
169  {
170  Request.DATA.SET_INFORMATION.InformationBuffer = NULL;
171  }
172  Request.DATA.SET_INFORMATION.BytesRead = 0;
173 
174  DPRINT("Setting OID 0x%x on adapter %wZ\n", SetOidRequest->Oid, &AdapterContext->DeviceName);
175 
176  /* Dispatch the request */
178  AdapterContext->BindingHandle,
179  &Request);
180 
181  /* Wait for the request */
183  {
184  KeWaitForSingleObject(&AdapterContext->AsyncEvent,
185  Executive,
186  KernelMode,
187  FALSE,
188  NULL);
189  Status = AdapterContext->AsyncStatus;
190  }
191 
192  /* Return the bytes read */
195  {
197  }
198  else if (Status == NDIS_STATUS_SUCCESS)
199  {
200  Irp->IoStatus.Information = sizeof(NDIS_OID) + Request.DATA.SET_INFORMATION.BytesRead;
201  }
202 
203  DPRINT("Final request status: 0x%x (%d)\n", Status, Irp->IoStatus.Information);
204  }
205  else
206  {
207  /* Bad parameters */
209  }
210 
211  Irp->IoStatus.Status = Status;
212 
214 
215  return Status;
216 }
_In_opt_ NDIS_HANDLE _In_opt_ NDIS_HANDLE _Inout_ PNDIS_REQUEST NdisRequest
Definition: ndis.h:1571
_In_ WDFREQUEST Request
Definition: cdrom.h:1234
#define NDIS_STATUS_PENDING
Definition: ndis.h:347
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
ULONG NDIS_OID
Definition: ntddndis.h:230
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
int NDIS_STATUS
Definition: ntddndis.h:471
#define FALSE
Definition: types.h:117
#define NDIS_STATUS_BUFFER_TOO_SHORT
Definition: ndis.h:487
smooth NULL
Definition: ftsmooth.c:416
#define NDIS_STATUS_INVALID_LENGTH
Definition: ndis.h:485
#define IoCompleteRequest
Definition: irp.c:1240
void DPRINT(...)
Definition: polytest.cpp:61
UNICODE_STRING DeviceName
Definition: ndisuio.h:44
NDIS_STATUS AsyncStatus
Definition: ndisuio.h:22
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
Status
Definition: gdiplustypes.h:24
NDIS_OID Oid
Definition: nuiouser.h:44
UCHAR Data[sizeof(ULONG)]
Definition: nuiouser.h:45
PFILE_OBJECT FileObject
Definition: iotypes.h:3148
NDIS_HANDLE BindingHandle
Definition: ndisuio.h:26
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3107

Referenced by NduDispatchDeviceControl().

◆ WaitForBind()

static NTSTATUS WaitForBind ( PIRP  Irp,
PIO_STACK_LOCATION  IrpSp 
)
static

Definition at line 16 of file ioctl.c.

17 {
18  /* I've seen several code samples that use this IOCTL but there's
19  * no official documentation on it. I'm just implementing it as a no-op
20  * right now because I don't see any reason we need it. We handle an open
21  * and bind just fine with IRP_MJ_CREATE and IOCTL_NDISUIO_OPEN_DEVICE */
22  DPRINT("Wait for bind complete\n");
23 
24  Irp->IoStatus.Status = STATUS_SUCCESS;
25  Irp->IoStatus.Information = 0;
26 
28 
29  return STATUS_SUCCESS;
30 }
_In_ PIRP Irp
Definition: csq.h:116
#define IoCompleteRequest
Definition: irp.c:1240
void DPRINT(...)
Definition: polytest.cpp:61
#define IO_NO_INCREMENT
Definition: iotypes.h:581
return STATUS_SUCCESS
Definition: btrfs.c:3014

Referenced by NduDispatchDeviceControl().