2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/create.c
5 * PURPOSE: Directory functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
7 * GetTempFileName is modified from WINE [ Alexandre Juiliard ]
10 * Removed use of SearchPath (not used by Windows)
13 /* INCLUDES *****************************************************************/
16 #include <ddk/ntddk.h>
21 #include <kernel32/kernel32.h>
23 /* EXTERNS ******************************************************************/
25 DWORD STDCALL
GetCurrentDriveW(DWORD nBufferLength
, PWSTR lpBuffer
);
27 /* FUNCTIONS ****************************************************************/
29 HANDLE STDCALL
CreateFileA(LPCSTR lpFileName
,
30 DWORD dwDesiredAccess
,
32 LPSECURITY_ATTRIBUTES lpSecurityAttributes
,
33 DWORD dwCreationDisposition
,
34 DWORD dwFlagsAndAttributes
,
38 WCHAR FileNameW
[MAX_PATH
];
41 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName
);
43 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
45 FileNameW
[i
] = *lpFileName
;
51 return CreateFileW(FileNameW
,dwDesiredAccess
,
54 dwCreationDisposition
,
60 HANDLE STDCALL
CreateFileW(LPCWSTR lpFileName
,
61 DWORD dwDesiredAccess
,
63 LPSECURITY_ATTRIBUTES lpSecurityAttributes
,
64 DWORD dwCreationDisposition
,
65 DWORD dwFlagsAndAttributes
,
70 OBJECT_ATTRIBUTES ObjectAttributes
;
71 IO_STATUS_BLOCK IoStatusBlock
;
72 UNICODE_STRING FileNameString
;
74 WCHAR PathNameW
[MAX_PATH
];
75 WCHAR FileNameW
[MAX_PATH
];
79 switch (dwCreationDisposition
)
82 dwCreationDisposition
= FILE_CREATE
;
86 dwCreationDisposition
= FILE_OVERWRITE_IF
;
90 dwCreationDisposition
= FILE_OPEN
;
94 dwCreationDisposition
= OPEN_ALWAYS
;
97 case TRUNCATE_EXISTING
:
98 dwCreationDisposition
= FILE_OVERWRITE
;
101 DPRINT("CreateFileW(lpFileName %w)\n",lpFileName
);
103 if (!(dwFlagsAndAttributes
& FILE_FLAG_OVERLAPPED
))
105 Flags
|= FILE_SYNCHRONOUS_IO_ALERT
;
108 if (lpFileName
[1] == (WCHAR
)':')
110 wcscpy(PathNameW
, lpFileName
);
112 else if (wcslen(lpFileName
) > 4 &&
113 lpFileName
[0] == (WCHAR
)'\\' &&
114 lpFileName
[1] == (WCHAR
)'\\' &&
115 lpFileName
[2] == (WCHAR
)'.' &&
116 lpFileName
[3] == (WCHAR
)'\\')
118 wcscpy(PathNameW
, lpFileName
);
120 else if (lpFileName
[0] == (WCHAR
)'\\')
122 GetCurrentDriveW(MAX_PATH
,PathNameW
);
123 wcscat(PathNameW
, lpFileName
);
127 Len
= GetCurrentDirectoryW(MAX_PATH
,PathNameW
);
130 if ( PathNameW
[Len
-1] != L
'\\' ) {
131 PathNameW
[Len
] = L
'\\';
132 PathNameW
[Len
+1] = 0;
134 wcscat(PathNameW
,lpFileName
);
142 wcscat(FileNameW
,PathNameW
);
144 FileNameString
.Length
= wcslen( FileNameW
)*sizeof(WCHAR
);
146 if ( FileNameString
.Length
== 0 )
149 if ( FileNameString
.Length
> MAX_PATH
*sizeof(WCHAR
) )
152 FileNameString
.Buffer
= (WCHAR
*)FileNameW
;
153 FileNameString
.MaximumLength
= FileNameString
.Length
+ sizeof(WCHAR
);
155 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
156 ObjectAttributes
.RootDirectory
= NULL
;
157 ObjectAttributes
.ObjectName
= &FileNameString
;
158 ObjectAttributes
.Attributes
= OBJ_CASE_INSENSITIVE
;
159 ObjectAttributes
.SecurityDescriptor
= NULL
;
160 ObjectAttributes
.SecurityQualityOfService
= NULL
;
162 DPRINT("File Name %w\n",FileNameW
);
164 Status
= ZwCreateFile(&FileHandle
,
169 dwFlagsAndAttributes
,
171 dwCreationDisposition
,
175 if (!NT_SUCCESS(Status
))
177 SetLastError(RtlNtStatusToDosError(Status
));
178 return INVALID_HANDLE_VALUE
;