[KERNEL32]
authorPierre Schweitzer <pierre@reactos.org>
Tue, 22 Feb 2011 18:43:38 +0000 (18:43 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Tue, 22 Feb 2011 18:43:38 +0000 (18:43 +0000)
Don't make GetBinaryTypeA() rely on Wine's strings conversions functions

svn path=/trunk/; revision=50867

reactos/dll/win32/kernel32/file/bintype.c

index e59a1c4..824121c 100644 (file)
@@ -301,23 +301,43 @@ GetBinaryTypeW (
  */
 BOOL
 WINAPI
-GetBinaryTypeA (
-    LPCSTR  lpApplicationName,
-    LPDWORD lpBinaryType
-    )
+GetBinaryTypeA(IN LPCSTR lpApplicationName,
+               OUT LPDWORD lpBinaryType)
 {
-  PWCHAR ApplicationNameW;
+    ANSI_STRING ApplicationNameString;
+    UNICODE_STRING ApplicationNameW;
+    BOOL StringAllocated = FALSE, Result;
+    NTSTATUS Status;
 
-  if(!lpApplicationName || !lpBinaryType)
-  {
-    SetLastError(ERROR_INVALID_PARAMETER);
-    return FALSE;
-  }
+    RtlInitAnsiString(&ApplicationNameString, lpApplicationName);
+
+    if (ApplicationNameString.Length * sizeof(WCHAR) >= NtCurrentTeb()->StaticUnicodeString.MaximumLength)
+    {
+        StringAllocated = TRUE;
+        Status = RtlAnsiStringToUnicodeString(&ApplicationNameW, &ApplicationNameString, TRUE);
+    }
+    else
+    {
+        Status = RtlAnsiStringToUnicodeString(&(NtCurrentTeb()->StaticUnicodeString), &ApplicationNameString, FALSE);
+    }
+
+    if (!NT_SUCCESS(Status))
+    {
+        BaseSetLastNTError(Status);
+        return FALSE;
+    }
 
-  if (!(ApplicationNameW = FilenameA2W(lpApplicationName, FALSE)))
-     return FALSE;
+    if (StringAllocated)
+    {
+        Result = GetBinaryTypeW(ApplicationNameW.Buffer, lpBinaryType);
+        RtlFreeUnicodeString(&ApplicationNameW);
+    }
+    else
+    {
+        Result = GetBinaryTypeW(NtCurrentTeb()->StaticUnicodeString.Buffer, lpBinaryType);
+    }
 
-  return GetBinaryTypeW(ApplicationNameW, lpBinaryType);
+    return Result;
 }
 
 /* EOF */