*** empty log message ***
authorRobert Kopferl <robertk@mok.lvcm.com>
Tue, 23 Jul 2002 13:00:11 +0000 (13:00 +0000)
committerRobert Kopferl <robertk@mok.lvcm.com>
Tue, 23 Jul 2002 13:00:11 +0000 (13:00 +0000)
svn path=/trunk/; revision=3298

os2/lib/doscalls/devices/devices.cpp [new file with mode: 0644]
os2/lib/doscalls/file/openclose.cpp [new file with mode: 0644]

diff --git a/os2/lib/doscalls/devices/devices.cpp b/os2/lib/doscalls/devices/devices.cpp
new file mode 100644 (file)
index 0000000..d8c5e4a
--- /dev/null
@@ -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 <ddk/ntddk.h>
+
+
+/*******************************************/
+/* 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 (file)
index 0000000..24d7047
--- /dev/null
@@ -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 <ddk/ntddk.h>
+
+
+
+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;
+}
+   
+
+