[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] Replace UTF8_STRING with OEM_STRING


  • To: <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Owen Smith <owen.smith@xxxxxxxxxx>
  • Date: Tue, 21 Sep 2021 11:45:52 +0100
  • Authentication-results: esa4.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none
  • Cc: Owen Smith <owen.smith@xxxxxxxxxx>
  • Delivery-date: Tue, 21 Sep 2021 10:46:07 +0000
  • Ironport-data: A9a23:39y/GqrQAmqNAhpl+GmevQsUao9eBmJgYhIvgKrLsJaIsI4StFCzt garIBnTOayKMGakf9slb4mz/U1S7J6Hn9M3GwVpry8yFH4Uo5uZCYyVIHmrMnLJJKUvbq7GA +byyDXkBJppJpMJjk71atANlZT4vE2xbuKU5NTsY0idfic5Dnd84f5fs7Rh2Ncw0ILgW1nlV e7a+KUzBnf0g1aYDUpMg06zgEsHUCPa4W5wUvQWPJinjXeG/5UnJMt3yZKZdhMUdrJ8DO+iL 9sv+Znilo/vE7XBPfv++lrzWhVirrc/pmFigFIOM0SpqkAqSiDfTs/XnRfTAKtao2zhojx/9 DlCnZOVbhctDp3poekMSQd0OSwkMqgf96CSdBBTseTLp6HHW37lwvEoB0AqJ4wIvO1wBAmi9 9RBdmpLNErawbvrnvTrEYGAhex6RCXvFIQAt3cm1jTYEfYOSpHfWaTao9Rf2V/cg+gTQaePN pREMFKDajzdPyQfYgc4F6kBv6SkvHTvbDt2sWOs8P9fD2/7k1UqjemF3MDuUsOLQ4BNgAOUq 3zL+0z9AwoGL5qPxDyd6HWui+TT2yThV+ov+KaQr6AwxgfJnypKVUNQBQDTTeSFZlCWVPd4O 0gkyg8XoLko6mCBQ4PyWkS3vyvR1vIDYOa8A9HW+SnUlPGNs13IVzBeJtJSQId5755tHFTGw nfMxomwVGI16NV5XFrAru/8kN+kBcQCwYbujwc/RA0Z6pHIpIgph3ojpf4yTfbo0rUZ9dz2q g1mTRTSZZ1I1qbnNI3hpDgrZg5AQbCTFWYICv3/BD7N0++ATNfNi3aUBb3nARFod9zxc7V8l CJcx5j2AB4mVMnQ/MByfAn9NO7wvKvUWNEtqXVuA4Mg51yQF42LJNsLiAyS0HxBa55eERewO Re7kVoIuPd7YSv7BYcqMtnZI5l7ksDd+SHNC6m8gixmOcMqKmdqPUhGOCat4owauBJ9yf1gY cjLL5nE4LRzIf0P8Qdajtw1idcDrh3SD0uKLXwi5xj4g7eYelCPTrIJbAmHYuwjtfvWqwTJ6 ddPccCNzkwHAuH5ZyDW968VLEwLcidnVcyn9ZQPe77ROBdiFUEgF+TVneErdbt6kvkHjezP5 Hy8BBNVkQKtmX3dJAyWQXl/c7ezD41npHc2MHV0b1al0nQue6i166Ibe8dldLUr7rU7n/V1U +MEa4OLBfEWEmbL/DEUbJ/cqo1+dUv02VLSbnT9ODVmJsxuXQ3E/NPgbzDDzihWA3rlr9Y6r p2hyhjfHcgJSTN9AZuEc/mo1V6w4yQQwbogQ0vSL9BPU0zw64w2eTfph/o6LsxQexXOwjyWi 1SfDRsC/LSfpoY09J/ChLyerpfvGOx7RxIIE27e5LewFC/b4mv8ntMQDLfWJWjQBDHu5aGvR eRJ1PWtYvQIkWFDv5d4D7s2n7k14MHipuMCwwlpdJkRg49H1l+0zqG64PRy
  • Ironport-hdrordr: A9a23:rNn7m6vrEcAEcVDg8DYSMzqr7skDctV00zEX/kB9WHVpm5qj5q STdZUgtSMc5wx7ZJhNo7q90cq7IE80l6Qb3WBLB8bGYOCOggLBEGgF1+bfKlbbdREWmNQw6U /OGZIOb+EZoTJB/KXHCKjTKadD/OW6
  • Ironport-sdr: UTOXEwl3flheL8yNMebiCIz+wqXyaEF1dhIg8wcQiirOLKmN3eVAKCtcsf5J4D+6C1FbFNJ2hI 1WT7KNlheBv/fvQK9qLGy9swmIl1VK1eHXCSZstRSVIiJyNc+7D6V6pj0NyvtWT7yPnr+SPQ88 +7gN/cB2HGYyEFAUd/ZX3IVnT66ELHuulVH90eBZJ4N6ZowK/f01AcfZV5aazx00RjPU9pwe41 DZ6As2lfu4RIhelrEdupJ2wVPzw1Bn47URUSNnRjp9Zh2ru2uAJOZekXwd93TQOwm2J9hm0vM2 VQOYTGyJk8+aOkxxtOT5wu1u
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

The UTF8 conversion functions treat UTF8_STRING as:
  struct {
      USHORT  Length;
      CHAR    Buffer[ANYSIZE_ARRAY];
  } UTF8_STRING;

But UTF8_STRING is defined by later WDKs as:
  struct {
      USHORT  Length;
      USHORT  MaximumLength;
      PCHAR   Buffer;
  } UTF8_STRING;

This difference leads to an 0x3B BSOD when anything attempts to use any WMI
method that deals with strings.

Replace UTF8_STRING with OEM_STRING which is available in all WDKs, and has
the same definition as UTF8_STRING from later WDKs, simplifying the usage
of retrieving strings from, or putting strings into, WMI buffers.

Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/xeniface/wmi.c | 199 +++++++++++++++++++++------------------------
 1 file changed, 94 insertions(+), 105 deletions(-)

diff --git a/src/xeniface/wmi.c b/src/xeniface/wmi.c
index aedd2f1..1b4c6c6 100644
--- a/src/xeniface/wmi.c
+++ b/src/xeniface/wmi.c
@@ -53,13 +53,6 @@
 #define UTF8MASK3 0x1FF800
 #define UTF8MASK4 0x1F0000
 
-#if (_MSC_VER <= 1922)
-typedef struct {
-    USHORT Length;
-    CHAR Buffer[1];
-} UTF8_STRING;
-#endif
-
 static FORCEINLINE PVOID
 WmiAllocate(
     IN  ULONG   Length
@@ -249,7 +242,7 @@ Utf8FromUtf32(
 
 static USHORT
 CountBytesUtf16FromUtf8String(
-    IN  const UTF8_STRING*  utf8
+    IN  PCOEM_STRING        utf8
     )
 {
     ULONG                   utf32;
@@ -319,7 +312,7 @@ GetAnsiString(
 
 static NTSTATUS
 GetUTF8String(
-    OUT UTF8_STRING**   utf8,
+    OUT POEM_STRING     utf8,
     IN  USHORT          bufsize,
     IN  LPWSTR          ustring
     )
@@ -333,17 +326,20 @@ GetUTF8String(
         bytecount += CountUtf8FromUtf32(utf32);
     }
 
-    *utf8 = WmiAllocate(sizeof(UTF8_STRING) + bytecount);
-    if ((*utf8) == NULL)
+    utf8->Length = 0;
+    utf8->MaximumLength = 0;
+    utf8->Buffer = WmiAllocate(bytecount + sizeof(WCHAR));
+    if (utf8->Buffer == NULL)
         return STATUS_INSUFFICIENT_RESOURCES;
 
-    (*utf8)->Length = bytecount;
+    utf8->Length = bytecount;
+    utf8->MaximumLength = bytecount + sizeof(WCHAR);
 
     bytecount = 0;
     i = 0;
-    while (i < bufsize/sizeof(WCHAR)) {
+    while (i < bufsize / sizeof(WCHAR)) {
         i += Utf32FromUtf16(&utf32, &ustring[i]);
-        bytecount += Utf8FromUtf32(&((*utf8)->Buffer[bytecount]), utf32);
+        bytecount += Utf8FromUtf32(&(utf8->Buffer[bytecount]), utf32);
     }
 
     return STATUS_SUCCESS;
@@ -351,15 +347,19 @@ GetUTF8String(
 
 static FORCEINLINE VOID
 FreeUTF8String(
-    IN  UTF8_STRING*    utf8
+    IN  POEM_STRING utf8
     )
 {
-    WmiFree(utf8);
+    if (utf8->Buffer)
+        WmiFree(utf8->Buffer);
+    utf8->Buffer = NULL;
+    utf8->Length = 0;
+    utf8->MaximumLength = 0;
 }
 
 static NTSTATUS
 GetCountedUTF8String(
-    OUT UTF8_STRING**   utf8,
+    OUT POEM_STRING     utf8,
     IN  PUCHAR          location
     )
 {
@@ -1523,7 +1523,7 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
     ULONG RequiredSize;
     NTSTATUS status;
     UCHAR* upathname;
-    UTF8_STRING *pathname;
+    OEM_STRING pathname;
     XenStoreSession *session;
     char *tmpbuffer;
 
@@ -1541,12 +1541,12 @@ SessionExecuteRemoveValue(UCHAR *InBuffer,
         return status;
 
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmpbuffer = WmiAllocate(pathname->Length + 1);
+    tmpbuffer = WmiAllocate(pathname.Length + 1);
     if (!tmpbuffer) {
         goto fail1;
     }
 
-    RtlCopyBytes(tmpbuffer,pathname->Buffer, pathname->Length);
+    RtlCopyBytes(tmpbuffer, pathname.Buffer, pathname.Length);
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -1560,7 +1560,7 @@ fail2:
     WmiFree(tmpbuffer);
 
 fail1:
-    FreeUTF8String(pathname);
+    FreeUTF8String(&pathname);
     return status;
 
 }
@@ -1696,8 +1696,8 @@ SessionExecuteSetValue(UCHAR *InBuffer,
     NTSTATUS status;
     UCHAR* upathname;
     UCHAR* uvalue;
-    UTF8_STRING* pathname;
-    UTF8_STRING* value;
+    OEM_STRING pathname;
+    OEM_STRING value;
     XenStoreSession *session;
     char *tmppath;
     char* tmpvalue;
@@ -1716,23 +1716,24 @@ SessionExecuteSetValue(UCHAR *InBuffer,
         return status;
 
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmppath = WmiAllocate(pathname->Length + 1);
+    tmppath = WmiAllocate(pathname.Length + 1);
     if (!tmppath) {
         goto fail1;
     }
 
-    RtlCopyBytes(tmppath,pathname->Buffer, pathname->Length);
+    RtlCopyBytes(tmppath, pathname.Buffer, pathname.Length);
+
     status = GetCountedUTF8String(&value, uvalue);
     if (!NT_SUCCESS(status)){
         goto fail2;
     }
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmpvalue = WmiAllocate(value->Length + 1);
+    tmpvalue = WmiAllocate(value.Length + 1);
     if (!tmpvalue) {
         goto fail3;
     }
 
-    RtlCopyBytes(tmpvalue,value->Buffer, value->Length);
+    RtlCopyBytes(tmpvalue, value.Buffer, value.Length);
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -1747,13 +1748,13 @@ fail4:
     WmiFree(tmpvalue);
 
 fail3:
-    FreeUTF8String(value);
+    FreeUTF8String(&value);
 
 fail2:
     WmiFree(tmppath);
 
 fail1:
-    FreeUTF8String(pathname);
+    FreeUTF8String(&pathname);
 
     *byteswritten = 0;
     return status;
@@ -1770,7 +1771,7 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     ULONG RequiredSize;
     UCHAR *uloc;
     NTSTATUS status;
-    UTF8_STRING* path;
+    OEM_STRING path;
     PCHAR listresults;
     size_t stringarraysize;
     UCHAR *valuepos;
@@ -1792,12 +1793,12 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     }
 
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmppath = WmiAllocate(path->Length + 1);
+    tmppath = WmiAllocate(path.Length + 1);
     if (!tmppath) {
         goto fail1;
     }
 
-    RtlCopyBytes(tmppath,path->Buffer, path->Length);
+    RtlCopyBytes(tmppath, path.Buffer, path.Length);
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -1812,16 +1813,15 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     }
 
     stringarraysize = 0;
-    if ((listresults != NULL ) && (listresults[0]!=0)) {
-        stringarraysize+=CountBytesUtf16FromUtf8String(path);
-        if ((path->Length!=1)||(path->Buffer[0]!='/')) {
+    if ((listresults != NULL) && (listresults[0] != 0)) {
+        stringarraysize += CountBytesUtf16FromUtf8String(&path);
+        if ((path.Length != 1) || (path.Buffer[0] != '/')) {
             // If the path isn't '/', we need to insert a
             // '/' between pathname and nodename;
-            stringarraysize+=sizeof(WCHAR);
+            stringarraysize += sizeof(WCHAR);
         }
-        stringarraysize+=GetCountedUtf8Size(listresults);
-    }
-    else {
+        stringarraysize += GetCountedUtf8Size(listresults);
+    } else {
         stringarraysize+=GetCountedUtf8Size("");
     }
 
@@ -1835,12 +1835,10 @@ SessionExecuteGetFirstChild(UCHAR *InBuffer,
     status = STATUS_SUCCESS;
     if ((listresults != NULL) && (listresults[0] != 0)) {
         PSTR fullpath;
-        if ((path->Length==1) && (path->Buffer[0]=='/')) {
+        if ((path.Length == 1) && (path.Buffer[0] == '/')) {
             fullpath = Xmasprintf("/%s", listresults);
-        }
-        else {
-            fullpath = Xmasprintf("%s/%s",
-                                    path->Buffer, listresults);
+        } else {
+            fullpath = Xmasprintf("%s/%s", path.Buffer, listresults);
         }
 
         if (fullpath == NULL) {
@@ -1866,7 +1864,7 @@ fail2:
     WmiFree(tmppath);
 
 fail1:
-    FreeUTF8String(path);
+    FreeUTF8String(&path);
 
     return status;
 
@@ -1883,7 +1881,7 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     ULONG RequiredSize;
     UCHAR *uloc;
     NTSTATUS status;
-    UTF8_STRING* path;
+    OEM_STRING path;
     ANSI_STRING checkleaf;
     PCHAR listresults;
     PCHAR nextresult;
@@ -1910,13 +1908,13 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     }
 
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmppath = WmiAllocate(path->Length + 1);
+    tmppath = WmiAllocate(path.Length + 1);
 
     if (!tmppath) {
         goto fail1;
     }
 
-    tmpleaf = WmiAllocate(path->Length + 1);
+    tmpleaf = WmiAllocate(path.Length + 1);
     if (!tmpleaf) {
         goto fail2;
     }
@@ -1928,28 +1926,22 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     }
 
     leafoffset = 0;
-    if (path->Length>1) {
-        leafoffset = path->Length;
-        while ((leafoffset!=0) && (path->Buffer[leafoffset] != '/'))
+    if (path.Length > 1) {
+        leafoffset = path.Length;
+        while ((leafoffset != 0) && (path.Buffer[leafoffset] != '/'))
             leafoffset--;
     }
-    if (leafoffset != 0){
+    if (leafoffset != 0) {
 #pragma warning(suppress:6386) // buffer overrun
-        RtlCopyBytes(tmppath,path->Buffer, leafoffset);
-        RtlCopyBytes(tmpleaf, path->Buffer+leafoffset+1, 
path->Length-leafoffset-1);
-    }
-    else {
-
-        if (path->Buffer[0] == '/') {
-            if (path->Length>1)
-                RtlCopyBytes(tmpleaf, path->Buffer+1, path->Length-1);
-            tmppath[0]='/';
-        }
-        else {
+        RtlCopyBytes(tmppath, path.Buffer, leafoffset);
+        RtlCopyBytes(tmpleaf, path.Buffer + leafoffset + 1, path.Length - 
leafoffset - 1);
+    } else if (path.Buffer[0] == '/') {
+        if (path.Length>1)
+            RtlCopyBytes(tmpleaf, path.Buffer + 1, path.Length - 1);
+        tmppath[0] = '/';
+    } else {
 #pragma warning(suppress:6386) // buffer overrun
-            RtlCopyBytes(tmpleaf, path->Buffer, path->Length);
-        }
-
+        RtlCopyBytes(tmpleaf, path.Buffer, path.Length);
     }
 
     status = XENBUS_STORE(Directory,&fdoData->StoreInterface, 
session->transaction, NULL, tmppath, &listresults);
@@ -1986,17 +1978,16 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
         attemptstring = nextresult;
     }
 
-    if (attemptstring!=NULL) {
-        stringarraysize+=CountBytesUtf16FromUtf8(tmppath); 
//sizeof(WCHAR)*leafoffset;
-        if ((path->Length!=1)||(path->Buffer[0]!='/')) {
+    if (attemptstring != NULL) {
+        stringarraysize += CountBytesUtf16FromUtf8(tmppath); 
//sizeof(WCHAR)*leafoffset;
+        if ((path.Length != 1) || (path.Buffer[0] != '/')) {
             // If the path isn't '/', we need to insert a
             // '/' between pathname and nodename;
-            stringarraysize+=sizeof(WCHAR);
+            stringarraysize += sizeof(WCHAR);
         }
-        stringarraysize+=GetCountedUtf8Size(attemptstring);
-    }
-    else {
-        stringarraysize+=GetCountedUtf8Size("");
+        stringarraysize += GetCountedUtf8Size(attemptstring);
+    } else {
+        stringarraysize += GetCountedUtf8Size("");
     }
 
     status = STATUS_BUFFER_TOO_SMALL;
@@ -2009,12 +2000,10 @@ SessionExecuteGetNextSibling(UCHAR *InBuffer,
     status = STATUS_SUCCESS;
     if (attemptstring != NULL) {
         PSTR fullpath;
-        if ((leafoffset==1) && (path->Buffer[0]=='/')) {
+        if ((leafoffset == 1) && (path.Buffer[0] == '/')) {
             fullpath = Xmasprintf("/%s", attemptstring);
-        }
-        else {
-            fullpath = Xmasprintf("%s/%s",
-                                    tmppath, attemptstring);
+        } else {
+            fullpath = Xmasprintf("%s/%s", tmppath, attemptstring);
         }
 
         if (fullpath == NULL) {
@@ -2042,7 +2031,7 @@ fail2:
     WmiFree(tmppath);
 
 fail1:
-    FreeUTF8String(path);
+    FreeUTF8String(&path);
     *byteswritten = RequiredSize;
     return status;
 
@@ -2060,7 +2049,7 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
     ULONG RequiredSize;
     UCHAR *uloc;
     NTSTATUS status;
-    UTF8_STRING* path;
+    OEM_STRING path;
     PCHAR listresults;
     PCHAR nextresults;
     ULONG *noofnodes;
@@ -2084,12 +2073,12 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
     }
 
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmppath = WmiAllocate(path->Length + 1);
+    tmppath = WmiAllocate(path.Length + 1);
     if (!tmppath) {
         goto fail1;
     }
 
-    RtlCopyBytes(tmppath,path->Buffer, path->Length);
+    RtlCopyBytes(tmppath, path.Buffer, path.Length);
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -2105,16 +2094,18 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
 
     stringarraysize = 0;
 
-    nextresults=listresults;
+    nextresults = listresults;
     while (*nextresults != 0) {
-        stringarraysize+=sizeof(WCHAR)*path->Length;
-        if ((path->Length!=1)||(path->Buffer[0]!='/')) {
+        stringarraysize += sizeof(WCHAR) * path.Length;
+        if ((path.Length != 1) || (path.Buffer[0] != '/')) {
             // If the path isn't '/', we need to insert a
             // '/' between pathname and nodename;
-            stringarraysize+=sizeof(WCHAR);
+            stringarraysize += sizeof(WCHAR);
         }
-        stringarraysize+=GetCountedUtf8Size(nextresults);
-        for (;*nextresults!=0;nextresults++);
+        stringarraysize += GetCountedUtf8Size(nextresults);
+
+        while (*nextresults != 0)
+            nextresults++;
         nextresults++;
     }
 
@@ -2128,15 +2119,13 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
 
     status = STATUS_SUCCESS;
     nextresults = listresults;
-    i=0;
-    while(*nextresults!=0) {
+    i = 0;
+    while (*nextresults != 0) {
         PSTR fullpath;
-        if ((path->Length==1) && (path->Buffer[0]=='/')) {
+        if ((path.Length == 1) && (path.Buffer[0] == '/')) {
             fullpath = Xmasprintf("/%s", nextresults);
-        }
-        else {
-            fullpath = Xmasprintf("%s/%s",
-                                    path->Buffer, nextresults);
+        } else {
+            fullpath = Xmasprintf("%s/%s", path.Buffer, nextresults);
         }
 
         if (fullpath == NULL) {
@@ -2145,13 +2134,13 @@ SessionExecuteGetChildren(UCHAR *InBuffer,
         }
 
         WriteCountedUTF8String(fullpath, valuepos);
-        valuepos+=GetCountedUtf8Size(fullpath);
+        valuepos += GetCountedUtf8Size(fullpath);
         WmiFree(fullpath);
-        for (;*nextresults!=0;nextresults++);
+
+        while (*nextresults != 0)
+            nextresults++;
         nextresults++;
         i++;
-
-
     }
     *noofnodes = i;
 
@@ -2163,7 +2152,7 @@ fail2:
     WmiFree(tmppath);
 
 fail1:
-    FreeUTF8String(path);
+    FreeUTF8String(&path);
     *byteswritten = RequiredSize;
     return status;
 }
@@ -2329,7 +2318,7 @@ SessionExecuteGetValue(UCHAR *InBuffer,
                         UNICODE_STRING *instance,
                         OUT ULONG_PTR *byteswritten) {
     NTSTATUS status;
-    UTF8_STRING* path;
+    OEM_STRING path;
     UCHAR *uloc;
     char *value;
     UCHAR *valuepos;
@@ -2352,12 +2341,12 @@ SessionExecuteGetValue(UCHAR *InBuffer,
         return status;;
 
     status = STATUS_INSUFFICIENT_RESOURCES;
-    tmppath = WmiAllocate(path->Length + 1);
+    tmppath = WmiAllocate(path.Length + 1);
     if (!tmppath) {
         goto fail1;
     }
 
-    RtlCopyBytes(tmppath,path->Buffer, path->Length);
+    RtlCopyBytes(tmppath, path.Buffer, path.Length);
 
     status = STATUS_WMI_INSTANCE_NOT_FOUND;
     if ((session = FindSessionByInstanceAndLock(fdoData, instance)) ==
@@ -2387,7 +2376,7 @@ fail2:
     WmiFree(tmppath);
 
 fail1:
-    FreeUTF8String(path);
+    FreeUTF8String(&path);
     return status;
 }
 NTSTATUS
-- 
2.31.1.windows.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.