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