return STATUS_NO_SUCH_DEVICE;
/* Initialize the miniport */
- MiniportInitialize(&DeviceExtension->Miniport,
- DeviceExtension,
- InitData);
+ Status = MiniportInitialize(&DeviceExtension->Miniport,
+ DeviceExtension,
+ InitData);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("MiniportInitialize() failed (Status 0x%08lx)\n", Status);
+ return Status;
+ }
/* Call the miniports FindAdapter function */
Status = MiniportFindAdapter(&DeviceExtension->Miniport);
/* FUNCTIONS ******************************************************************/
-VOID
+NTSTATUS
MiniportInitialize(
_In_ PMINIPORT Miniport,
_In_ PFDO_DEVICE_EXTENSION DeviceExtension,
_In_ PHW_INITIALIZATION_DATA InitData)
{
+ PMINIPORT_DEVICE_EXTENSION MiniportExtension;
+ ULONG Size;
+
+ DPRINT1("MiniportInitialize(%p %p %p)\n",
+ Miniport, DeviceExtension, InitData);
+
Miniport->DeviceExtension = DeviceExtension;
Miniport->InitData = InitData;
+
+ /* Calculate the miniport device extension size */
+ Size = sizeof(MINIPORT_DEVICE_EXTENSION) +
+ Miniport->InitData->DeviceExtensionSize;
+
+ /* Allocate and initialize the miniport device extension */
+ MiniportExtension = ExAllocatePoolWithTag(NonPagedPool,
+ Size,
+ TAG_MINIPORT_DATA);
+ if (MiniportExtension == NULL)
+ return STATUS_NO_MEMORY;
+
+ RtlZeroMemory(MiniportExtension, Size);
+
+ MiniportExtension->Miniport = Miniport;
+ Miniport->MiniportExtension = MiniportExtension;
+
+ return STATUS_SUCCESS;
}
DPRINT1("MiniportFindAdapter(%p)\n", Miniport);
- Result = Miniport->InitData->HwFindAdapter(NULL,
+ /* Call the miniport HwFindAdapter routine */
+ Result = Miniport->InitData->HwFindAdapter(&Miniport->MiniportExtension->HwDeviceExtension,
NULL,
NULL,
NULL,
DPRINT1("MiniportHwInitialize(%p)\n", Miniport);
- Status = Miniport->InitData->HwInitialize(NULL);
+ /* Call the miniport HwInitialize routine */
+ Status = Miniport->InitData->HwInitialize(&Miniport->MiniportExtension->HwDeviceExtension);
DPRINT1("HwInitialize() returned 0x%08lx\n", Status);
return Status;
#include <wdmguid.h>
/* Memory Tags */
-#define TAG_GLOBAL_DATA 'DGtS'
-#define TAG_INIT_DATA 'DItS'
+#define TAG_GLOBAL_DATA 'DGtS'
+#define TAG_INIT_DATA 'DItS'
+#define TAG_MINIPORT_DATA 'DMtS'
typedef enum
{
LIST_ENTRY InitDataListHead;
} DRIVER_OBJECT_EXTENSION, *PDRIVER_OBJECT_EXTENSION;
+typedef struct _MINIPORT_DEVICE_EXTENSION
+{
+ struct _MINIPORT *Miniport;
+ UCHAR HwDeviceExtension[0];
+} MINIPORT_DEVICE_EXTENSION, *PMINIPORT_DEVICE_EXTENSION;
+
typedef struct _MINIPORT
{
struct _FDO_DEVICE_EXTENSION *DeviceExtension;
PHW_INITIALIZATION_DATA InitData;
+ PMINIPORT_DEVICE_EXTENSION MiniportExtension;
} MINIPORT, *PMINIPORT;
typedef struct _FDO_DEVICE_EXTENSION
/* miniport.c */
-VOID
+NTSTATUS
MiniportInitialize(
_In_ PMINIPORT Miniport,
_In_ PFDO_DEVICE_EXTENSION DeviceExtension,