NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { ULONG Status; HW_INITIALIZATION_DATA HwInitializationData; PVOID driver_extension; PUCHAR ptr; FUNCTION_ENTER(); KdPrint((__DRIVER_NAME " IRQL = %d\n", KeGetCurrentIrql())); IoAllocateDriverObjectExtension(DriverObject, UlongToPtr(XEN_INIT_DRIVER_EXTENSION_MAGIC), PAGE_SIZE, &driver_extension); ptr = driver_extension; ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_RING, "ring-ref", NULL, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_EVENT_CHANNEL_IRQ, "event-channel", NULL, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_GRANT_ENTRIES, UlongToPtr((ULONG)'SCSI'), UlongToPtr(144), NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_XB_STATE_MAP_PRE_CONNECT, NULL, NULL, NULL); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateInitialised); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateConnected); __ADD_XEN_INIT_UCHAR(&ptr, 20); __ADD_XEN_INIT_UCHAR(&ptr, 0); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_XB_STATE_MAP_POST_CONNECT, NULL, NULL, NULL); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateConnected); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateConnected); __ADD_XEN_INIT_UCHAR(&ptr, 20); __ADD_XEN_INIT_UCHAR(&ptr, 0); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_XB_STATE_MAP_SHUTDOWN, NULL, NULL, NULL); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosing); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosing); __ADD_XEN_INIT_UCHAR(&ptr, 50); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosed); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosed); __ADD_XEN_INIT_UCHAR(&ptr, 50); //__ADD_XEN_INIT_UCHAR(&ptr, XenbusStateInitWait); //ialising); //__ADD_XEN_INIT_UCHAR(&ptr, XenbusStateInitWait); //__ADD_XEN_INIT_UCHAR(&ptr, 50); __ADD_XEN_INIT_UCHAR(&ptr, 0); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_END, NULL, NULL, NULL); /* RegistryPath == NULL when we are invoked as a crash dump driver */ if (!RegistryPath) { dump_mode = TRUE; } RtlZeroMemory(&HwInitializationData, sizeof(HW_INITIALIZATION_DATA)); HwInitializationData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA); HwInitializationData.AdapterInterfaceType = PNPBus; HwInitializationData.DeviceExtensionSize = sizeof(XENSCSI_DEVICE_DATA); HwInitializationData.SpecificLuExtensionSize = sizeof(XENSCSI_LU_DATA); HwInitializationData.SrbExtensionSize = 0; HwInitializationData.NumberOfAccessRanges = 1; HwInitializationData.MapBuffers = TRUE; HwInitializationData.NeedPhysicalAddresses = FALSE; HwInitializationData.TaggedQueuing = TRUE; HwInitializationData.AutoRequestSense = TRUE; HwInitializationData.MultipleRequestPerLu = TRUE; HwInitializationData.HwInitialize = XenScsi_HwScsiInitialize; HwInitializationData.HwStartIo = XenScsi_HwScsiStartIo; HwInitializationData.HwInterrupt = XenScsi_HwScsiInterrupt; HwInitializationData.HwFindAdapter = XenScsi_HwScsiFindAdapter; HwInitializationData.HwResetBus = XenScsi_HwScsiResetBus; HwInitializationData.HwAdapterControl = XenScsi_HwScsiAdapterControl; Status = ScsiPortInitialize(DriverObject, RegistryPath, &HwInitializationData, NULL); if(!NT_SUCCESS(Status)) { KdPrint((__DRIVER_NAME " ScsiPortInitialize failed with status 0x%08x\n", Status)); } FUNCTION_EXIT(); return Status; }
NDIS_STATUS XenNet_D0Entry(struct xennet_info *xi) { NDIS_STATUS status; PUCHAR ptr; CHAR buf[128]; FUNCTION_ENTER(); xi->shutting_down = FALSE; ptr = xi->config_page; ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_RING, "tx-ring-ref", NULL, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_RING, "rx-ring-ref", NULL, NULL); #pragma warning(suppress:4054) ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_EVENT_CHANNEL, "event-channel", (PVOID)XenNet_HandleEvent, xi); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_READ_STRING_BACK, "mac", NULL, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_READ_STRING_BACK, "feature-sg", NULL, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_READ_STRING_BACK, "feature-gso-tcpv4", NULL, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_WRITE_STRING, "request-rx-copy", "1", NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_WRITE_STRING, "feature-rx-notify", "1", NULL); RtlStringCbPrintfA(buf, ARRAY_SIZE(buf), "%d", !xi->config_csum); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_WRITE_STRING, "feature-no-csum-offload", buf, NULL); RtlStringCbPrintfA(buf, ARRAY_SIZE(buf), "%d", (int)xi->config_sg); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_WRITE_STRING, "feature-sg", buf, NULL); RtlStringCbPrintfA(buf, ARRAY_SIZE(buf), "%d", !!xi->config_gso); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_WRITE_STRING, "feature-gso-tcpv4", buf, NULL); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_XB_STATE_MAP_PRE_CONNECT, NULL, NULL, NULL); __ADD_XEN_INIT_UCHAR(&ptr, 0); /* no pre-connect required */ ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_XB_STATE_MAP_POST_CONNECT, NULL, NULL, NULL); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateConnected); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateConnected); __ADD_XEN_INIT_UCHAR(&ptr, 20); __ADD_XEN_INIT_UCHAR(&ptr, 0); ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_XB_STATE_MAP_SHUTDOWN, NULL, NULL, NULL); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosing); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosing); __ADD_XEN_INIT_UCHAR(&ptr, 50); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosed); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateClosed); __ADD_XEN_INIT_UCHAR(&ptr, 50); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateInitialising); __ADD_XEN_INIT_UCHAR(&ptr, XenbusStateInitWait); __ADD_XEN_INIT_UCHAR(&ptr, 50); __ADD_XEN_INIT_UCHAR(&ptr, 0); #ifdef DEBUG_407_1241 ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_COLOR_INIT, NULL, NULL, NULL); #endif ADD_XEN_INIT_REQ(&ptr, XEN_INIT_TYPE_END, NULL, NULL, NULL); status = xi->vectors.XenPci_XenConfigDevice(xi->vectors.context); if (!NT_SUCCESS(status)) { KdPrint(("Failed to complete device configuration (%08x)\n", status)); return status; } status = XenNet_ConnectBackend(xi); if (!NT_SUCCESS(status)) { KdPrint(("Failed to complete device configuration (%08x)\n", status)); return status; } if (!xi->config_sg) { /* without SG, GSO can be a maximum of PAGE_SIZE */ xi->config_gso = min(xi->config_gso, PAGE_SIZE); } XenNet_TxInit(xi); XenNet_RxInit(xi); xi->connected = TRUE; KeMemoryBarrier(); // packets could be received anytime after we set Frontent to Connected FUNCTION_EXIT(); return status; }