From a6c291342aedbd918961a2d75abb9b07d40f4cca Mon Sep 17 00:00:00 2001 From: Robert Kopferl Date: Tue, 23 Jul 2002 13:00:11 +0000 Subject: [PATCH] *** empty log message *** svn path=/trunk/; revision=3298 --- os2/lib/doscalls/devices/devices.cpp | 59 +++++++++ os2/lib/doscalls/file/openclose.cpp | 186 +++++++++++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 os2/lib/doscalls/devices/devices.cpp create mode 100644 os2/lib/doscalls/file/openclose.cpp diff --git a/os2/lib/doscalls/devices/devices.cpp b/os2/lib/doscalls/devices/devices.cpp new file mode 100644 index 00000000000..d8c5e4aa3e7 --- /dev/null +++ b/os2/lib/doscalls/devices/devices.cpp @@ -0,0 +1,59 @@ +/* $Id: devices.cpp,v 1.1 2002/07/23 13:00:10 robertk Exp $ +*/ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS OS/2 sub system + * FILE: devices.c + * PURPOSE: Kernelservices for OS/2 apps + * PROGRAMMER: Robert K. nonvolatil@yahoo.de + * REVISION HISTORY: + * 13-03-2002 Created + */ + +#define INCL_DOSDEVICES +#include "../../../include/os2.h" +#include + + +/*******************************************/ +/* DosDevIOCtl performs control functions */ +/* on a device specified by an opened */ +/* device handle. */ +/*******************************************/ +/*HFILE hDevice; Device handle returned by DosOpen, or a standard (open) device handle. */ +/*ULONG category; Device category. */ +/*ULONG function; Device-specific function code. */ +/*PVOID pParams; Address of the command-specific argument list. */ +/*ULONG cbParmLenMax; Length, in bytes, of pParams. */ +/*PULONG pcbParmLen; Pointer to the length of parameters. */ +/*PVOID pData; Address of the data area. */ +/*ULONG cbDataLenMax; Length, in bytes, of pData. */ +/*PULONG pcbDataLen; Pointer to the length of data. */ +/*APIRET ulrc; Return Code. + + ulrc (APIRET) - returns + Return Code. + + DosDevIOCtl returns one of the following values: + + 0 NO_ERROR + 1 ERROR_INVALID_FUNCTION + 6 ERROR_INVALID_HANDLE + 15 ERROR_INVALID_DRIVE + 31 ERROR_GEN_FAILURE + 87 ERROR_INVALID_PARAMETER + 111 ERROR_BUFFER_OVERFLOW + 115 ERROR_PROTECTION_VIOLATION + 117 ERROR_INVALID_CATEGORY + 119 ERROR_BAD_DRIVER_LEVEL + 163 ERROR_UNCERTAIN_MEDIA + 165 ERROR_MONITORS_NOT_SUPPORTED + +*/ +APIRET STDCALL Dos32DevIOCtl(HFILE hDevice, ULONG category, ULONG function, + PVOID pParams,ULONG cbParmLenMax,PULONG pcbParmLen, + PVOID pData,ULONG cbDataLenMax,PULONG pcbDataLen) +{ + return 0; +} diff --git a/os2/lib/doscalls/file/openclose.cpp b/os2/lib/doscalls/file/openclose.cpp new file mode 100644 index 00000000000..24d7047c81b --- /dev/null +++ b/os2/lib/doscalls/file/openclose.cpp @@ -0,0 +1,186 @@ +/* $Id: openclose.cpp,v 1.1 2002/07/23 13:00:11 robertk Exp $ +*/ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS OS/2 sub system + * FILE: dll/doscalls.c + * PURPOSE: Kernelservices for OS/2 apps + * PROGRAMMER: Robert K. nonvolatil@yahoo.de + * REVISION HISTORY: + * 13-03-2002 Created + */ + + +#define INCL_DOSFILEMGR +#include "../../../include/os2.h" +#include + + + +APIRET STDCALL Dos32Open(PSZ pszFileName, PHFILE pHf, + 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 0; +} + + +/* close a Handle. seems finished */ +APIRET STDCALL Dos32Close(HFILE hFile) +{ + NTSTATUS nErrCode; + nErrCode = NtClose( (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 Dos32Read(HFILE hFile, PVOID pBuffer, + ULONG cbRead, PULONG pcbActual) +{ + NTSTATUS nErrCode; + IO_STATUS_BLOCK isbStatus; + // read data from file + nErrCode = NtReadFile( (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 Dos32Write(HFILE hFile, PVOID pBuffer, + ULONG cbWrite, PULONG pcbActual) +{ + NTSTATUS nErrCode; + IO_STATUS_BLOCK StatusBlk; + nErrCode = NtWriteFile( (HANDLE)hFile, NULL, NULL, NULL, + &StatusBlk, pBuffer, cbWrite, 0, NULL ); + *pcbActual = StatusBlk.Information; + // do an errorcode translation FIXME: correct + 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; +} + + +