1 /* $Id: openclose.cpp,v 1.1 2002/07/23 13:00:11 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
15 #define INCL_DOSFILEMGR
16 #include "../../../include/os2.h"
17 #include <ddk/ntddk.h>
21 APIRET STDCALL
Dos32Open(PSZ pszFileName
, PHFILE pHf
,
22 PULONG pulAction
, ULONG cbFile
,
23 ULONG ulAttribute
, ULONG fsOpenFlags
,
24 ULONG fsOpenMode
, PVOID reserved
) //ULONGPEAOP2 peaop2)
28 OUT PHANDLE FileHandle,
29 IN ACCESS_MASK DesiredAccess,
30 IN POBJECT_ATTRIBUTES ObjectAttributes,
31 OUT PIO_STATUS_BLOCK IoStatusBlock,
32 IN PLARGE_INTEGER AllocationSize OPTIONAL,
33 IN ULONG FileAttributes,
35 IN ULONG CreateDisposition,
36 IN ULONG CreateOptions,
37 IN PVOID EaBuffer OPTIONAL,
43 OBJECT_ATTRIBUTES ObjectAttributes
;
44 IO_STATUS_BLOCK IoStatusBlock
;
45 UNICODE_STRING NtPathU
;
50 switch (dwCreationDisposition
)
53 dwCreationDisposition
= FILE_CREATE
;
57 dwCreationDisposition
= FILE_OVERWRITE_IF
;
61 dwCreationDisposition
= FILE_OPEN
;
65 dwCreationDisposition
= OPEN_ALWAYS
;
68 case TRUNCATE_EXISTING
:
69 dwCreationDisposition
= FILE_OVERWRITE
;
72 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName
);
74 if (dwDesiredAccess
& GENERIC_READ
)
75 dwDesiredAccess
|= FILE_GENERIC_READ
;
77 if (dwDesiredAccess
& GENERIC_WRITE
)
78 dwDesiredAccess
|= FILE_GENERIC_WRITE
;
80 if (!(dwFlagsAndAttributes
& FILE_FLAG_OVERLAPPED
))
82 Flags
|= FILE_SYNCHRONOUS_IO_ALERT
;
85 if (!RtlDosPathNameToNtPathName_U ((LPWSTR
)lpFileName
,
89 return INVALID_HANDLE_VALUE
;
91 DPRINT("NtPathU \'%S\'\n", NtPathU
.Buffer
);
93 ObjectAttributes
.Length
= sizeof(OBJECT_ATTRIBUTES
);
94 ObjectAttributes
.RootDirectory
= NULL
;
95 ObjectAttributes
.ObjectName
= &NtPathU
;
96 ObjectAttributes
.Attributes
= OBJ_CASE_INSENSITIVE
;
97 ObjectAttributes
.SecurityDescriptor
= NULL
;
98 ObjectAttributes
.SecurityQualityOfService
= NULL
;
100 Status
= NtCreateFile (&FileHandle
,
105 dwFlagsAndAttributes
,
107 dwCreationDisposition
,
111 if (!NT_SUCCESS(Status
))
113 SetLastErrorByStatus (Status
);
114 return INVALID_HANDLE_VALUE
;
123 /* close a Handle. seems finished */
124 APIRET STDCALL
Dos32Close(HFILE hFile
)
127 nErrCode
= NtClose( (HANDLE
)hFile
);
132 case STATUS_INVALID_HANDLE
:
133 return ERROR_INVALID_HANDLE
;
134 case STATUS_HANDLE_NOT_CLOSABLE
:
135 return ERROR_FILE_NOT_FOUND
;
143 APIRET STDCALL
Dos32Read(HFILE hFile
, PVOID pBuffer
,
144 ULONG cbRead
, PULONG pcbActual
)
147 IO_STATUS_BLOCK isbStatus
;
148 // read data from file
149 nErrCode
= NtReadFile( (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
)
168 IO_STATUS_BLOCK StatusBlk
;
169 nErrCode
= NtWriteFile( (HANDLE
)hFile
, NULL
, NULL
, NULL
,
170 &StatusBlk
, pBuffer
, cbWrite
, 0, NULL
);
171 *pcbActual
= StatusBlk
.Information
;
172 // do an errorcode translation FIXME: correct
177 case STATUS_ACCESS_DENIED
:
178 case STATUS_INVALID_HANDLE
:
179 case STATUS_FILE_LOCK_CONFLICT
: