mirror of
https://github.com/reactos/reactos.git
synced 2024-09-05 02:07:06 +00:00
200 lines
4.6 KiB
C++
200 lines
4.6 KiB
C++
/* $Id: openclose.cpp,v 1.5 2004/01/31 01:29:11 robertk Exp $
|
|
*/
|
|
/*
|
|
*
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
* PROJECT: ReactOS OS/2 sub system
|
|
* PART: doscalls.dll
|
|
* FILE: openclose.cpp
|
|
* PURPOSE: Kernelservices for OS/2 apps
|
|
* CONTAINS: Open close write and handle related stuff.
|
|
* PROGRAMMER: Robert K. nonvolatil@yahoo.de
|
|
* REVISION HISTORY:
|
|
* 13-03-2002 Created
|
|
* 25-07-2002 Work to make it compile
|
|
*/
|
|
|
|
|
|
#define INCL_DOSFILEMGR
|
|
#define INCL_DOSERRORS
|
|
#include "ros2.h"
|
|
|
|
|
|
<<<<<<< openclose.cpp
|
|
|
|
APIRET STDCALL DosOpen(PSZ pszFileName, PHFILE pHf,
|
|
=======
|
|
APIRET STDCALL Dos32Open(PSZ pszFileName, PHFILE pHf,
|
|
>>>>>>> 1.4
|
|
PULONG pulAction, ULONG cbFile,
|
|
ULONG ulAttribute, ULONG fsOpenFlags,
|
|
ULONG fsOpenMode, PVOID reserved ) //ULONGPEAOP2 peaop2)
|
|
{
|
|
/* NTAPI
|
|
ZwCreateFile(
|
|
OUT PHANDLE FileHandle,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
|
IN PLARGE_INTEGER AllocationSize OPTIONAL,
|
|
IN ULONG FileAttributes,
|
|
IN ULONG ShareAccess,
|
|
IN ULONG CreateDisposition,
|
|
IN ULONG CreateOptions,
|
|
IN PVOID EaBuffer OPTIONAL,
|
|
IN ULONG EaLength
|
|
);*/
|
|
|
|
/*
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
UNICODE_STRING NtPathU;
|
|
HANDLE FileHandle;
|
|
NTSTATUS Status;
|
|
ULONG Flags = 0;
|
|
|
|
switch (dwCreationDisposition)
|
|
{
|
|
case CREATE_NEW:
|
|
dwCreationDisposition = FILE_CREATE;
|
|
break;
|
|
|
|
case CREATE_ALWAYS:
|
|
dwCreationDisposition = FILE_OVERWRITE_IF;
|
|
break;
|
|
|
|
case OPEN_EXISTING:
|
|
dwCreationDisposition = FILE_OPEN;
|
|
break;
|
|
|
|
case OPEN_ALWAYS:
|
|
dwCreationDisposition = OPEN_ALWAYS;
|
|
break;
|
|
|
|
case TRUNCATE_EXISTING:
|
|
dwCreationDisposition = FILE_OVERWRITE;
|
|
}
|
|
|
|
DPRINT("CreateFileW(lpFileName %S)\n",lpFileName);
|
|
|
|
if (dwDesiredAccess & GENERIC_READ)
|
|
dwDesiredAccess |= FILE_GENERIC_READ;
|
|
|
|
if (dwDesiredAccess & GENERIC_WRITE)
|
|
dwDesiredAccess |= FILE_GENERIC_WRITE;
|
|
|
|
if (!(dwFlagsAndAttributes & FILE_FLAG_OVERLAPPED))
|
|
{
|
|
Flags |= FILE_SYNCHRONOUS_IO_ALERT;
|
|
}
|
|
|
|
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFileName,
|
|
&NtPathU,
|
|
NULL,
|
|
NULL))
|
|
return INVALID_HANDLE_VALUE;
|
|
|
|
DPRINT("NtPathU \'%S\'\n", NtPathU.Buffer);
|
|
|
|
ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
|
|
ObjectAttributes.RootDirectory = NULL;
|
|
ObjectAttributes.ObjectName = &NtPathU;
|
|
ObjectAttributes.Attributes = OBJ_CASE_INSENSITIVE;
|
|
ObjectAttributes.SecurityDescriptor = NULL;
|
|
ObjectAttributes.SecurityQualityOfService = NULL;
|
|
|
|
Status = NtCreateFile (&FileHandle,
|
|
dwDesiredAccess,
|
|
&ObjectAttributes,
|
|
&IoStatusBlock,
|
|
NULL,
|
|
dwFlagsAndAttributes,
|
|
dwShareMode,
|
|
dwCreationDisposition,
|
|
Flags,
|
|
NULL,
|
|
0);
|
|
if (!NT_SUCCESS(Status))
|
|
{
|
|
SetLastErrorByStatus (Status);
|
|
return INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
return FileHandle;*/
|
|
|
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
|
|
/* close a Handle. seems finished */
|
|
APIRET STDCALL DosClose(HFILE hFile)
|
|
{
|
|
NT::NTSTATUS nErrCode;
|
|
nErrCode = NT::ZwClose( (NT::HANDLE)hFile );
|
|
switch( nErrCode )
|
|
{
|
|
/*
|
|
case STATUS_SUCCESS:
|
|
return NO_ERROR;
|
|
case STATUS_INVALID_HANDLE:
|
|
return ERROR_INVALID_HANDLE;
|
|
case STATUS_HANDLE_NOT_CLOSABLE:
|
|
return ERROR_FILE_NOT_FOUND;
|
|
*/
|
|
}
|
|
return nErrCode;
|
|
}
|
|
|
|
|
|
|
|
APIRET STDCALL DosRead(HFILE hFile, PVOID pBuffer,
|
|
ULONG cbRead, PULONG pcbActual)
|
|
{
|
|
NT::NTSTATUS nErrCode;
|
|
NT::IO_STATUS_BLOCK isbStatus;
|
|
// read data from file
|
|
nErrCode = NT::ZwReadFile( (NT::HANDLE)hFile, NULL, NULL, NULL,
|
|
&isbStatus, pBuffer, cbRead,
|
|
NULL, NULL );
|
|
// contains the # bytes actually read.
|
|
*pcbActual = isbStatus.Information;
|
|
switch(nErrCode)
|
|
{
|
|
/*
|
|
case STATUS_INVALID_HANDLE:
|
|
return ERROR_INVALID_HANDLE;
|
|
// FIXME: complete this
|
|
*/
|
|
}
|
|
return NO_ERROR;
|
|
}
|
|
|
|
/* Generic write to a stream given by hFile */
|
|
APIRET STDCALL DosWrite(HFILE hFile, PVOID pBuffer,
|
|
ULONG cbWrite, PULONG pcbActual)
|
|
{
|
|
NT::NTSTATUS nErrCode;
|
|
NT::IO_STATUS_BLOCK StatusBlk;
|
|
nErrCode = NtWriteFile( (NT::HANDLE)hFile, NULL, NULL, NULL,
|
|
&StatusBlk, pBuffer, cbWrite, 0, NULL );
|
|
// FIXME *pcbActual = StatusBlk.Information;
|
|
// do an errorcode translation FIXME: correct
|
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
switch(nErrCode)
|
|
{
|
|
/*
|
|
case STATUS_SUCCESS:
|
|
case STATUS_PENDING:
|
|
case STATUS_ACCESS_DENIED:
|
|
case STATUS_INVALID_HANDLE:
|
|
case STATUS_FILE_LOCK_CONFLICT:
|
|
return 0;
|
|
*/
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|