1 /* $Id: openclose.cpp,v 1.4 2003/01/07 16:23:11 robd Exp $
5 * COPYRIGHT: See COPYING in the top level directory
6 * PROJECT: ReactOS OS/2 sub system
9 * PURPOSE: Kernelservices for OS/2 apps
10 * CONTAINS: Open close write and handle related stuff.
11 * PROGRAMMER: Robert K. nonvolatil@yahoo.de
14 * 25-07-2002 Work to make it compile
18 #define INCL_DOSFILEMGR
19 #define INCL_DOSERRORS
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)
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,
37 IN ULONG CreateDisposition,
38 IN ULONG CreateOptions,
39 IN PVOID EaBuffer OPTIONAL,
45 OBJECT_ATTRIBUTES ObjectAttributes;
46 IO_STATUS_BLOCK IoStatusBlock;
47 UNICODE_STRING NtPathU;
52 switch (dwCreationDisposition)
55 dwCreationDisposition = FILE_CREATE;
59 dwCreationDisposition = FILE_OVERWRITE_IF;
63 dwCreationDisposition = FILE_OPEN;
67 dwCreationDisposition = OPEN_ALWAYS;
70 case TRUNCATE_EXISTING:
71 dwCreationDisposition = FILE_OVERWRITE;
74 DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
76 if (dwDesiredAccess & GENERIC_READ)
77 dwDesiredAccess |= FILE_GENERIC_READ;
79 if (dwDesiredAccess & GENERIC_WRITE)
80 dwDesiredAccess |= FILE_GENERIC_WRITE;
82 if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
84 Flags |= FILE_SYNCHRONOUS_IO_ALERT;
87 if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
91 return INVALID_HANDLE_VALUE;
93 DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
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;
102 Status = NtCreateFile (&FileHandle,
107 dwFlagsAndAttributes,
109 dwCreationDisposition,
113 if (!NT_SUCCESS(Status))
115 SetLastErrorByStatus (Status);
116 return INVALID_HANDLE_VALUE;
121 return ERROR_CALL_NOT_IMPLEMENTED
;
125 /* close a Handle. seems finished */
126 APIRET STDCALL
Dos32Close(HFILE hFile
)
128 NT::NTSTATUS nErrCode
;
129 nErrCode
= NT::ZwClose( (NT::HANDLE
)hFile
);
135 case STATUS_INVALID_HANDLE:
136 return ERROR_INVALID_HANDLE;
137 case STATUS_HANDLE_NOT_CLOSABLE:
138 return ERROR_FILE_NOT_FOUND;
146 APIRET STDCALL
Dos32Read(HFILE hFile
, PVOID pBuffer
,
147 ULONG cbRead
, PULONG pcbActual
)
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
,
155 // contains the # bytes actually read.
156 *pcbActual
= isbStatus
.Information
;
160 case STATUS_INVALID_HANDLE:
161 return ERROR_INVALID_HANDLE;
162 // FIXME: complete this
168 /* Generic write to a stream given by hFile */
169 APIRET STDCALL
Dos32Write(HFILE hFile
, PVOID pBuffer
,
170 ULONG cbWrite
, PULONG pcbActual
)
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
;
184 case STATUS_ACCESS_DENIED:
185 case STATUS_INVALID_HANDLE:
186 case STATUS_FILE_LOCK_CONFLICT: