update for HEAD-2003091401
[reactos.git] / lib / kernel32 / file / dir.c
index 269efe7..a2a9a10 100644 (file)
 
 /* INCLUDES ******************************************************************/
 
-#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>
-#include <windows.h>
-#include <string.h>
-#include <wchar.h>
+#include <k32.h>
 
 #define NDEBUG
 #include <kernel32/kernel32.h>
-#include <kernel32/error.h>
 
 
 /* FUNCTIONS *****************************************************************/
 
+/*
+ * @implemented
+ */
 WINBOOL
 STDCALL
 CreateDirectoryA (
@@ -40,6 +38,10 @@ CreateDirectoryA (
                                   lpSecurityAttributes);
 }
 
+
+/*
+ * @implemented
+ */
 WINBOOL
 STDCALL
 CreateDirectoryExA (
@@ -109,6 +111,9 @@ CreateDirectoryExA (
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL
 STDCALL
 CreateDirectoryW (
@@ -122,6 +127,9 @@ CreateDirectoryW (
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL
 STDCALL
 CreateDirectoryExW (
@@ -138,6 +146,13 @@ CreateDirectoryExW (
 
        DPRINT ("lpTemplateDirectory %S lpNewDirectory %S lpSecurityAttributes %p\n",
                lpTemplateDirectory, lpNewDirectory, lpSecurityAttributes);
+  
+  // Can't create empty directory
+  if(lpNewDirectory == NULL || *lpNewDirectory == 0)
+  {
+    SetLastError(ERROR_PATH_NOT_FOUND);
+    return FALSE;
+  }
 
        if (lpTemplateDirectory != NULL && *lpTemplateDirectory != 0)
        {
@@ -190,6 +205,9 @@ CreateDirectoryExW (
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL
 STDCALL
 RemoveDirectoryA (
@@ -223,6 +241,9 @@ RemoveDirectoryA (
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL
 STDCALL
 RemoveDirectoryW (
@@ -303,6 +324,9 @@ RemoveDirectoryW (
 }
 
 
+/*
+ * @implemented
+ */
 DWORD
 STDCALL
 GetFullPathNameA (
@@ -319,6 +343,7 @@ GetFullPathNameA (
        PWSTR FilePartU;
        ULONG BufferLength;
        ULONG Offset;
+       DWORD FullNameLen;
 
        DPRINT("GetFullPathNameA(lpFileName %s, nBufferLength %d, lpBuffer %p, "
               "lpFilePart %p)\n",lpFileName,nBufferLength,lpBuffer,lpFilePart);
@@ -349,16 +374,21 @@ GetFullPathNameA (
        FullName.Length = 0;
        FullName.Buffer = lpBuffer;
 
-       RtlUnicodeStringToAnsiString (&FullName,
-                                     &FullNameU,
-                                     FALSE);
-
-       if (lpFilePart != NULL)
+        if (lpBuffer != NULL )
        {
-               Offset = (ULONG)(FilePartU - FullNameU.Buffer);
-               *lpFilePart = FullName.Buffer + Offset;
+               RtlUnicodeStringToAnsiString (&FullName,
+                                       &FullNameU,
+                                       FALSE);
+
+               if (lpFilePart != NULL)
+               {
+                       Offset = (ULONG)(FilePartU - FullNameU.Buffer);
+                       *lpFilePart = FullName.Buffer + Offset;
+               }
        }
 
+       FullNameLen = FullNameU.Length / sizeof(WCHAR);
+       
        RtlFreeHeap (RtlGetProcessHeap (),
                     0,
                     FullNameU.Buffer);
@@ -366,10 +396,13 @@ GetFullPathNameA (
        DPRINT("lpBuffer %s lpFilePart %s Length %ld\n",
               lpBuffer, lpFilePart, FullName.Length);
 
-       return FullName.Length;
+       return FullNameLen;
 }
 
 
+/*
+ * @implemented
+ */
 DWORD
 STDCALL
 GetFullPathNameW (
@@ -396,6 +429,9 @@ GetFullPathNameW (
 }
 
 
+/*
+ * @unimplemented
+ */
 DWORD
 STDCALL
 GetShortPathNameA (
@@ -419,6 +455,9 @@ GetShortPathNameA (
 }
 
 
+/*
+ * @unimplemented
+ */
 DWORD
 STDCALL
 GetShortPathNameW (
@@ -431,6 +470,9 @@ GetShortPathNameW (
 }
 
 
+/*
+ * @implemented
+ */
 DWORD
 STDCALL
 SearchPathA (
@@ -533,6 +575,9 @@ SearchPathA (
 }
 
 
+/*
+ * @implemented
+ */
 DWORD
 STDCALL
 SearchPathW (
@@ -596,6 +641,7 @@ SearchPathW (
                                                len * sizeof(WCHAR));
                if (EnvironmentBufferW == NULL)
                {
+                       SetLastError(ERROR_OUTOFMEMORY);
                        return 0;
                }
 
@@ -612,13 +658,18 @@ SearchPathW (
                lpPath = EnvironmentBufferW;
        }
 
-       retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension, nBufferLength, lpBuffer, lpFilePart);
+       retCode = RtlDosSearchPath_U ((PWCHAR)lpPath, (PWCHAR)lpFileName, (PWCHAR)lpExtension, 
+                                     nBufferLength * sizeof(WCHAR), lpBuffer, lpFilePart);
 
        if (EnvironmentBufferW != NULL)
        {
                RtlFreeHeap(GetProcessHeap(), 0, EnvironmentBufferW);
        }
-       return retCode;
+       if (retCode == 0)
+       {
+               SetLastError(ERROR_FILE_NOT_FOUND);
+       }
+       return retCode / sizeof(WCHAR);
 }
 
 /* EOF */