1 /* $Id: openclose.cpp,v 1.2 2002/07/26 00:23:12 robertk Exp $
5 * COPYRIGHT: See COPYING in the top level directory
6 * PROJECT: ReactOS OS/2 sub system
8 * PURPOSE: Kernelservices for OS/2 apps
9 * PROGRAMMER: Robert K. nonvolatil@yahoo.de
12 * 25-07-2002 Work to make it compile
16 #define INCL_DOSFILEMGR
17 #define INCL_DOSERRORS
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)
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,
36 IN ULONG CreateDisposition,
37 IN ULONG CreateOptions,
38 IN PVOID EaBuffer OPTIONAL,
44 OBJECT_ATTRIBUTES ObjectAttributes;
45 IO_STATUS_BLOCK IoStatusBlock;
46 UNICODE_STRING NtPathU;
51 switch (dwCreationDisposition)
54 dwCreationDisposition = FILE_CREATE;
58 dwCreationDisposition = FILE_OVERWRITE_IF;
62 dwCreationDisposition = FILE_OPEN;
66 dwCreationDisposition = OPEN_ALWAYS;
69 case TRUNCATE_EXISTING:
70 dwCreationDisposition = FILE_OVERWRITE;
73 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
75 if (dwDesiredAccess & GENERIC_READ)
76 dwDesiredAccess |= FILE_GENERIC_READ;
78 if (dwDesiredAccess & GENERIC_WRITE)
79 dwDesiredAccess |= FILE_GENERIC_WRITE;
81 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
83 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
86 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
90 return INVALID_HANDLE_VALUE;
92 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
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;
101 Status = NtCreateFile (&FileHandle,
106 dwFlagsAndAttributes,
108 dwCreationDisposition,
112 if (!NT_SUCCESS(Status))
114 SetLastErrorByStatus (Status);
115 return INVALID_HANDLE_VALUE;
120 return ERROR_CALL_NOT_IMPLEMENTED
;
124 /* close a Handle. seems finished */
125 APIRET STDCALL
Dos32Close(HFILE hFile
)
127 NT::NTSTATUS nErrCode
;
128 nErrCode
= NT::ZwClose( (NT::HANDLE
)hFile
);
133 case STATUS_INVALID_HANDLE
:
134 return ERROR_INVALID_HANDLE
;
135 case STATUS_HANDLE_NOT_CLOSABLE
:
136 return ERROR_FILE_NOT_FOUND
;
143 APIRET STDCALL
Dos32Read(HFILE hFile
, PVOID pBuffer
,
144 ULONG cbRead
, PULONG pcbActual
)
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
,
152 // contains the # bytes actually read.
153 *pcbActual
= isbStatus
.Information
;
156 case STATUS_INVALID_HANDLE
:
157 return ERROR_INVALID_HANDLE
;
158 // FIXME: complete this
163 /* Generic write to a stream given by hFile */
164 APIRET STDCALL
Dos32Write(HFILE hFile
, PVOID pBuffer
,
165 ULONG cbWrite
, PULONG pcbActual
)
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
;
178 case STATUS_ACCESS_DENIED
:
179 case STATUS_INVALID_HANDLE
:
180 case STATUS_FILE_LOCK_CONFLICT
: