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
,
37 WCHAR FileNameW
[MAX_PATH
];
40 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName
);
42 while ((*lpFileName
)!=0 && i
< MAX_PATH
)
44 FileNameW
[i
] = *lpFileName
;
50 return CreateFileW(FileNameW
,dwDesiredAccess
,
53 dwCreationDisposition
,
59 HANDLE STDCALL
CreateFileW(LPCWSTR lpFileName
,
60 DWORD dwDesiredAccess
,
62 LPSECURITY_ATTRIBUTES lpSecurityAttributes
,
63 DWORD dwCreationDisposition
,
64 DWORD dwFlagsAndAttributes
,
69 OBJECT_ATTRIBUTES ObjectAttributes
;
70 IO_STATUS_BLOCK IoStatusBlock
;
71 UNICODE_STRING FileNameString
;
73 WCHAR PathNameW
[MAX_PATH
];
74 WCHAR FileNameW
[MAX_PATH
];
77 switch (dwCreationDisposition
)
80 dwCreationDisposition
= FILE_CREATE
;
84 dwCreationDisposition
= FILE_OVERWRITE_IF
;
88 dwCreationDisposition
= FILE_OPEN
;
92 dwCreationDisposition
= OPEN_ALWAYS
;
95 case TRUNCATE_EXISTING
:
96 dwCreationDisposition
= FILE_OVERWRITE
;
99 DPRINT("CreateFileW(lpFileName %w)\n",lpFileName
);
101 if (dwDesiredAccess
& GENERIC_READ
)
102 dwDesiredAccess
|= FILE_GENERIC_READ
;
104 if (dwDesiredAccess
& GENERIC_WRITE
)
105 dwDesiredAccess
|= FILE_GENERIC_WRITE
;
107 if (!(dwFlagsAndAttributes
& FILE_FLAG_OVERLAPPED
))
109 Flags
|= FILE_SYNCHRONOUS_IO_ALERT
;
112 if (lpFileName
[1] == (WCHAR
)':')
114 wcscpy(PathNameW
, lpFileName
);
116 else if (wcslen(lpFileName
) > 4 &&
117 lpFileName
[0] == (WCHAR
)'\\' &&
118 lpFileName
[1] == (WCHAR
)'\\' &&
119 lpFileName
[2] == (WCHAR
)'.' &&
120 lpFileName
[3] == (WCHAR
)'\\')
122 wcscpy(PathNameW
, lpFileName
);
124 else if (lpFileName
[0] == (WCHAR
)'\\')
126 GetCurrentDriveW(MAX_PATH
,PathNameW
);
127 wcscat(PathNameW
, lpFileName
);
131 Len
= GetCurrentDirectoryW(MAX_PATH
,PathNameW
);
134 if ( PathNameW
[Len
-1] != L
'\\' ) {
135 PathNameW
[Len
] = L
'\\';
136 PathNameW
[Len
+1] = 0;
138 wcscat(PathNameW
,lpFileName
);
146 wcscat(FileNameW
,PathNameW
);
148 FileNameString
.Length
= wcslen( FileNameW
)*sizeof(WCHAR
);
150 if ( FileNameString
.Length
== 0 )
153 if ( FileNameString
.Length
> MAX_PATH
*sizeof(WCHAR
) )
156 FileNameString
.Buffer
= (WCHAR
*)FileNameW
;
157 FileNameString
.MaximumLength
= FileNameString
.Length
+ sizeof(WCHAR
);
159 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
160 ObjectAttributes
.RootDirectory
= NULL
;
161 ObjectAttributes
.ObjectName
= &FileNameString
;
162 ObjectAttributes
.Attributes
= OBJ_CASE_INSENSITIVE
;
163 ObjectAttributes
.SecurityDescriptor
= NULL
;
164 ObjectAttributes
.SecurityQualityOfService
= NULL
;
166 DPRINT("File Name %w\n",FileNameW
);
168 Status
= ZwCreateFile(&FileHandle
,
173 dwFlagsAndAttributes
,
175 dwCreationDisposition
,
179 if (!NT_SUCCESS(Status
))
181 SetLastError(RtlNtStatusToDosError(Status
));
182 return INVALID_HANDLE_VALUE
;