d549188c61a78716367b249a328330068bcf86a8
[reactos.git] / reactos / lib / kernel32 / file / create.c
1 /* $Id: create.c,v 1.22 2001/09/09 12:21:37 hbirr Exp $
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: lib/kernel32/file/create.c
6 * PURPOSE: Directory functions
7 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
8 * GetTempFileName is modified from WINE [ Alexandre Juiliard ]
9 * UPDATE HISTORY:
10 * Created 01/11/98
11 * Removed use of SearchPath (not used by Windows)
12 */
13
14 /* INCLUDES *****************************************************************/
15
16 #include <ddk/ntddk.h>
17 #include <ntdll/rtl.h>
18 #include <windows.h>
19
20 #define NDEBUG
21 #include <kernel32/kernel32.h>
22 #include <kernel32/error.h>
23
24
25 /* FUNCTIONS ****************************************************************/
26
27 HANDLE STDCALL CreateFileA (LPCSTR lpFileName,
28 DWORD dwDesiredAccess,
29 DWORD dwShareMode,
30 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
31 DWORD dwCreationDisposition,
32 DWORD dwFlagsAndAttributes,
33 HANDLE hTemplateFile)
34 {
35 UNICODE_STRING FileNameU;
36 ANSI_STRING FileName;
37 HANDLE FileHandle;
38
39 DPRINT("CreateFileA(lpFileName %s)\n",lpFileName);
40
41 RtlInitAnsiString (&FileName,
42 (LPSTR)lpFileName);
43
44 /* convert ansi (or oem) string to unicode */
45 if (bIsFileApiAnsi)
46 RtlAnsiStringToUnicodeString (&FileNameU,
47 &FileName,
48 TRUE);
49 else
50 RtlOemStringToUnicodeString (&FileNameU,
51 &FileName,
52 TRUE);
53
54 FileHandle = CreateFileW (FileNameU.Buffer,
55 dwDesiredAccess,
56 dwShareMode,
57 lpSecurityAttributes,
58 dwCreationDisposition,
59 dwFlagsAndAttributes,
60 hTemplateFile);
61
62 RtlFreeHeap (RtlGetProcessHeap (),
63 0,
64 FileNameU.Buffer);
65
66 return FileHandle;
67 }
68
69
70 HANDLE STDCALL CreateFileW (LPCWSTR lpFileName,
71 DWORD dwDesiredAccess,
72 DWORD dwShareMode,
73 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
74 DWORD dwCreationDisposition,
75 DWORD dwFlagsAndAttributes,
76 HANDLE hTemplateFile)
77 {
78 OBJECT_ATTRIBUTES ObjectAttributes;
79 IO_STATUS_BLOCK IoStatusBlock;
80 UNICODE_STRING NtPathU;
81 HANDLE FileHandle;
82 NTSTATUS Status;
83 ULONG Flags = 0;
84
85 switch (dwCreationDisposition)
86 {
87 case CREATE_NEW:
88 dwCreationDisposition = FILE_CREATE;
89 break;
90
91 case CREATE_ALWAYS:
92 dwCreationDisposition = FILE_OVERWRITE_IF;
93 break;
94
95 case OPEN_EXISTING:
96 dwCreationDisposition = FILE_OPEN;
97 break;
98
99 case OPEN_ALWAYS:
100 dwCreationDisposition = OPEN_ALWAYS;
101 break;
102
103 case TRUNCATE_EXISTING:
104 dwCreationDisposition = FILE_OVERWRITE;
105 }
106
107 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
108
109 if (dwDesiredAccess & GENERIC_READ)
110 dwDesiredAccess |= FILE_GENERIC_READ;
111
112 if (dwDesiredAccess & GENERIC_WRITE)
113 dwDesiredAccess |= FILE_GENERIC_WRITE;
114
115 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
116 {
117 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
118 }
119
120 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
121 &NtPathU,
122 NULL,
123 NULL))
124 return INVALID_HANDLE_VALUE;
125
126 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
127
128 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
129 ObjectAttributes.RootDirectory = NULL;
130 ObjectAttributes.ObjectName = &NtPathU;
131 ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
132 ObjectAttributes.SecurityDescriptor = NULL;
133 ObjectAttributes.SecurityQualityOfService = NULL;
134
135 Status = NtCreateFile (&FileHandle,
136 dwDesiredAccess,
137 &ObjectAttributes,
138 &IoStatusBlock,
139 NULL,
140 dwFlagsAndAttributes,
141 dwShareMode,
142 dwCreationDisposition,
143 Flags,
144 NULL,
145 0);
146 if (!NT_SUCCESS(Status))
147 {
148 SetLastErrorByStatus (Status);
149 return INVALID_HANDLE_VALUE;
150 }
151
152 return FileHandle;
153 }
154
155 /* EOF */