[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Stash a pointer to _snprintf_s in the ADAPTER structure
It is problematic if we don't, as on resume from suspend we need to re-acquire the function pointer and this seems to lead to a BSOD, despite there being no documentation to suggest that use of the aux_klib functions at DISPATCH_LEVEL is disallowed. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xennet/adapter.c | 61 +++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c index d85f4d1..dc69a7f 100644 --- a/src/xennet/adapter.c +++ b/src/xennet/adapter.c @@ -81,6 +81,12 @@ struct _XENNET_ADAPTER { PXENNET_RECEIVER Receiver; PXENNET_TRANSMITTER Transmitter; BOOLEAN Enabled; + + NTSTATUS (*_snprintf_s)(char *, + size_t, + size_t, + const char *, + ...); }; static LONG AdapterCount; @@ -1300,11 +1306,6 @@ __AdapterSetDistribution( ) { ULONG Index; - NTSTATUS (*___snprintf_s)(char *, - size_t, - size_t, - const char *, - ...); CHAR Distribution[MAXNAMELEN]; CHAR Vendor[MAXNAMELEN]; const CHAR *Product; @@ -1312,21 +1313,15 @@ __AdapterSetDistribution( Trace("====>\n"); - status = LinkGetRoutineAddress("ntdll.dll", - "_snprintf_s", - (PVOID *)&___snprintf_s); - if (!NT_SUCCESS(status)) - goto fail1; - Index = 0; while (Index <= MAXIMUM_INDEX) { PCHAR Buffer; - (VOID) ___snprintf_s(Distribution, - MAXNAMELEN, - _TRUNCATE, - "%u", - Index); + (VOID) Adapter->_snprintf_s(Distribution, + MAXNAMELEN, + _TRUNCATE, + "%u", + Index); status = XENBUS_STORE(Read, &Adapter->StoreInterface, @@ -1338,7 +1333,7 @@ __AdapterSetDistribution( if (status == STATUS_OBJECT_NAME_NOT_FOUND) goto update; - goto fail2; + goto fail1; } XENBUS_STORE(Free, @@ -1349,14 +1344,14 @@ __AdapterSetDistribution( } status = STATUS_UNSUCCESSFUL; - goto fail3; + goto fail2; update: - (VOID) ___snprintf_s(Vendor, - MAXNAMELEN, - _TRUNCATE, - "%s", - VENDOR_NAME_STR); + (VOID) Adapter->_snprintf_s(Vendor, + MAXNAMELEN, + _TRUNCATE, + "%s", + VENDOR_NAME_STR); for (Index = 0; Vendor[Index] != '\0'; Index++) if (!isalnum((UCHAR)Vendor[Index])) @@ -1389,9 +1384,6 @@ update: Trace("<====\n"); return STATUS_SUCCESS; -fail3: - Error("fail3\n"); - fail2: Error("fail2\n"); @@ -1498,16 +1490,22 @@ AdapterEnable( if (!NT_SUCCESS(status)) goto fail2; - status = AdapterSetDistribution(Adapter); + status = LinkGetRoutineAddress("ntdll.dll", + "_snprintf_s", + (PVOID *)&Adapter->_snprintf_s); if (!NT_SUCCESS(status)) goto fail3; + status = AdapterSetDistribution(Adapter); + if (!NT_SUCCESS(status)) + goto fail4; + status = XENVIF_VIF(Enable, &Adapter->VifInterface, AdapterVifCallback, Adapter); if (!NT_SUCCESS(status)) - goto fail4; + goto fail5; AdapterMediaStateChange(Adapter); @@ -1515,9 +1513,12 @@ AdapterEnable( return NDIS_STATUS_SUCCESS; -fail4: +fail5: AdapterClearDistribution(Adapter); +fail4: + Adapter->_snprintf_s = NULL; + fail3: XENBUS_SUSPEND(Release, &Adapter->SuspendInterface); @@ -1543,6 +1544,8 @@ AdapterDisable( AdapterClearDistribution(Adapter); + Adapter->_snprintf_s = NULL; + XENBUS_SUSPEND(Release, &Adapter->SuspendInterface); XENBUS_STORE(Release, &Adapter->StoreInterface); } -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |