d638ef097a8452b47b1e1695e0dc4975ce310e35
[reactos.git] / os2 / lib / doscalls / file / openclose.cpp
1 /* $Id: openclose.cpp,v 1.4 2003/01/07 16:23:11 robd Exp $
2 */
3 /*
4 *
5 * COPYRIGHT: See COPYING in the top level directory
6 * PROJECT: ReactOS OS/2 sub system
7 * PART: doscalls.dll
8 * FILE: openclose.cpp
9 * PURPOSE: Kernelservices for OS/2 apps
10 * CONTAINS: Open close write and handle related stuff.
11 * PROGRAMMER: Robert K. nonvolatil@yahoo.de
12 * REVISION HISTORY:
13 * 13-03-2002 Created
14 * 25-07-2002 Work to make it compile
15 */
16
17
18 #define INCL_DOSFILEMGR
19 #define INCL_DOSERRORS
20 #include "ros2.h"
21
22
23 APIRET STDCALL Dos32Open(PSZ pszFileName, PHFILE pHf,
24 PULONG pulAction, ULONG cbFile,
25 ULONG ulAttribute, ULONG fsOpenFlags,
26 ULONG fsOpenMode, PVOID reserved ) //ULONGPEAOP2 peaop2)
27 {
28 /* NTAPI
29 ZwCreateFile(
30 OUT PHANDLE FileHandle,
31 IN ACCESS_MASK DesiredAccess,
32 IN POBJECT_ATTRIBUTES ObjectAttributes,
33 OUT PIO_STATUS_BLOCK IoStatusBlock,
34 IN PLARGE_INTEGER AllocationSize OPTIONAL,
35 IN ULONG FileAttributes,
36 IN ULONG ShareAccess,
37 IN ULONG CreateDisposition,
38 IN ULONG CreateOptions,
39 IN PVOID EaBuffer OPTIONAL,
40 IN ULONG EaLength
41 );*/
42
43 /*
44
45 OBJECT_ATTRIBUTES ObjectAttributes;
46 IO_STATUS_BLOCK IoStatusBlock;
47 UNICODE_STRING NtPathU;
48 HANDLE FileHandle;
49 NTSTATUS Status;
50 ULONG Flags = 0;
51
52 switch (dwCreationDisposition)
53 {
54 case CREATE_NEW:
55 dwCreationDisposition = FILE_CREATE;
56 break;
57
58 case CREATE_ALWAYS:
59 dwCreationDisposition = FILE_OVERWRITE_IF;
60 break;
61
62 case OPEN_EXISTING:
63 dwCreationDisposition = FILE_OPEN;
64 break;
65
66 case OPEN_ALWAYS:
67 dwCreationDisposition = OPEN_ALWAYS;
68 break;
69
70 case TRUNCATE_EXISTING:
71 dwCreationDisposition = FILE_OVERWRITE;
72 }
73
74 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
75
76 if (dwDesiredAccess & GENERIC_READ)
77 dwDesiredAccess |= FILE_GENERIC_READ;
78
79 if (dwDesiredAccess & GENERIC_WRITE)
80 dwDesiredAccess |= FILE_GENERIC_WRITE;
81
82 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
83 {
84 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
85 }
86
87 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
88 &NtPathU,
89 NULL,
90 NULL))
91 return INVALID_HANDLE_VALUE;
92
93 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
94
95 ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
96 ObjectAttributes.RootDirectory = NULL;
97 ObjectAttributes.ObjectName = &NtPathU;
98 ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
99 ObjectAttributes.SecurityDescriptor = NULL;
100 ObjectAttributes.SecurityQualityOfService = NULL;
101
102 Status = NtCreateFile (&FileHandle,
103 dwDesiredAccess,
104 &ObjectAttributes,
105 &IoStatusBlock,
106 NULL,
107 dwFlagsAndAttributes,
108 dwShareMode,
109 dwCreationDisposition,
110 Flags,
111 NULL,
112 0);
113 if (!NT_SUCCESS(Status))
114 {
115 SetLastErrorByStatus (Status);
116 return INVALID_HANDLE_VALUE;
117 }
118
119 return FileHandle;*/
120
121 return ERROR_CALL_NOT_IMPLEMENTED;
122 }
123
124
125 /* close a Handle. seems finished */
126 APIRET STDCALL Dos32Close(HFILE hFile)
127 {
128 NT::NTSTATUS nErrCode;
129 nErrCode = NT::ZwClose( (NT::HANDLE)hFile );
130 switch( nErrCode )
131 {
132 /*
133 case STATUS_SUCCESS:
134 return NO_ERROR;
135 case STATUS_INVALID_HANDLE:
136 return ERROR_INVALID_HANDLE;
137 case STATUS_HANDLE_NOT_CLOSABLE:
138 return ERROR_FILE_NOT_FOUND;
139 */
140 }
141 return nErrCode;
142 }
143
144
145
146 APIRET STDCALL Dos32Read(HFILE hFile, PVOID pBuffer,
147 ULONG cbRead, PULONG pcbActual)
148 {
149 NT::NTSTATUS nErrCode;
150 NT::IO_STATUS_BLOCK isbStatus;
151 // read data from file
152 nErrCode = NT::ZwReadFile( (NT::HANDLE)hFile, NULL, NULL, NULL,
153 &isbStatus, pBuffer, cbRead,
154 NULL, NULL );
155 // contains the # bytes actually read.
156 *pcbActual = isbStatus.Information;
157 switch(nErrCode)
158 {
159 /*
160 case STATUS_INVALID_HANDLE:
161 return ERROR_INVALID_HANDLE;
162 // FIXME: complete this
163 */
164 }
165 return NO_ERROR;
166 }
167
168 /* Generic write to a stream given by hFile */
169 APIRET STDCALL Dos32Write(HFILE hFile, PVOID pBuffer,
170 ULONG cbWrite, PULONG pcbActual)
171 {
172 NT::NTSTATUS nErrCode;
173 NT::IO_STATUS_BLOCK StatusBlk;
174 nErrCode = NtWriteFile( (NT::HANDLE)hFile, NULL, NULL, NULL,
175 &StatusBlk, pBuffer, cbWrite, 0, NULL );
176 // FIXME *pcbActual = StatusBlk.Information;
177 // do an errorcode translation FIXME: correct
178 return ERROR_CALL_NOT_IMPLEMENTED;
179 switch(nErrCode)
180 {
181 /*
182 case STATUS_SUCCESS:
183 case STATUS_PENDING:
184 case STATUS_ACCESS_DENIED:
185 case STATUS_INVALID_HANDLE:
186 case STATUS_FILE_LOCK_CONFLICT:
187 return 0;
188 */
189 }
190 return 0;
191 }
192
193
194