- Start rosapps rearrange and cleanup process.
[reactos.git] / rosapps / applications / sysutils / utils / pice / module / privateice.c
diff --git a/rosapps/applications/sysutils/utils/pice/module/privateice.c b/rosapps/applications/sysutils/utils/pice/module/privateice.c
new file mode 100644 (file)
index 0000000..918011d
--- /dev/null
@@ -0,0 +1,203 @@
+/*++
+
+Copyright (c) 1998-2001 Klaus P. Gerlicher
+
+Module Name:
+
+    privateice.c
+
+Abstract:
+
+Environment:
+
+Author:
+
+    Klaus P. Gerlicher
+
+       reactos port by:
+                       Eugene Ingerman
+
+Revision History:
+
+    16-Jul-1998:       created
+    15-Nov-2000:    general cleanup of source files
+    19-Jan-2001:    renamed to privateice.c
+
+       10/20/2001:             porting to reactos begins
+
+Copyright notice:
+
+  This file may be distributed under the terms of the GNU Public License.
+
+--*/
+
+////////////////////////////////////////////////////
+// INCLUDES
+////
+/*
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <asm/uaccess.h>
+#include <linux/fs.h>
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <asm/unistd.h>
+#include <linux/string.h>
+*/
+
+#include <ntddk.h>
+#include <debug.h>
+#include <rosrtl/string.h>
+
+#include "precomp.h"
+#include "serial.h"
+
+////////////////////////////////////////////////////
+// GLOBALS
+////
+
+BOOLEAN bDeviceAlreadyOpen = FALSE;
+
+char tempPICE[1024];
+
+////////////////////////////////////////////////////
+// FUNCTIONS
+////
+
+//*************************************************************************
+// pice_open()
+//
+//*************************************************************************
+
+NTSTATUS STDCALL pice_open(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+    DPRINT((0,"pice_open\n"));
+
+    /* We don't want to talk to two processes at the
+    * same time */
+    if (bDeviceAlreadyOpen){
+               IoCompleteRequest (Irp, IO_NO_INCREMENT);
+               return STATUS_UNSUCCESSFUL;     /* is there a more descriptive status code for this case? */
+       }
+
+    bDeviceAlreadyOpen = TRUE;
+       IoCompleteRequest (Irp, IO_NO_INCREMENT);
+       return STATUS_SUCCESS;
+}
+
+//*************************************************************************
+// pice_close()
+//
+//*************************************************************************
+NTSTATUS STDCALL pice_close(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+    DPRINT((0,"pice_close\n"));
+
+       CleanUpPICE();                      // used to be in cleanup_module
+
+       /* We're now ready for our next caller */
+    bDeviceAlreadyOpen = FALSE;
+       IoCompleteRequest (Irp, IO_NO_INCREMENT);
+
+       return STATUS_SUCCESS;
+}
+
+
+//*************************************************************************
+// pice_ioctl()
+//
+//*************************************************************************
+
+NTSTATUS STDCALL pice_ioctl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+//     char* pFilename = (char*) ioctl_param;
+
+       PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation( Irp );
+
+       ULONG Code = IoStack->Parameters.DeviceIoControl.IoControlCode;
+
+       switch(Code)
+       {
+               case PICE_IOCTL_LOAD:
+            break;
+               case PICE_IOCTL_RELOAD:
+            if(!ReloadSymbols())
+            {
+                           PICE_sprintf(tempPICE,"pICE: not able to reload symbols\n");
+                           Print(OUTPUT_WINDOW,tempPICE);
+            }
+                       break;
+               case PICE_IOCTL_UNLOAD:
+            UnloadSymbols();
+                       break;
+               case PICE_IOCTL_BREAK:
+                       PICE_sprintf(tempPICE,"pICE: forcible break\n");
+                       Print(OUTPUT_WINDOW,tempPICE);
+            __asm__ __volatile("int $3");
+            break;
+               case PICE_IOCTL_STATUS:
+            {
+                PDEBUGGER_STATUS_BLOCK ustatus_block_p;
+                DEBUGGER_STATUS_BLOCK kstatus_block;
+
+                               ULONG OutLength = IoStack->Parameters.DeviceIoControl.OutputBufferLength;
+                               if( OutLength < sizeof( DEBUGGER_STATUS_BLOCK ) ){
+                                       return STATUS_INVALID_PARAMETER;
+                               }
+
+                               ustatus_block_p = (PDEBUGGER_STATUS_BLOCK)Irp->AssociatedIrp.SystemBuffer;
+
+                //kstatus_block.Test = 0x12345678;
+                RtlCopyMemory(ustatus_block_p, &kstatus_block, sizeof(DEBUGGER_STATUS_BLOCK) );
+            }
+            break;
+        default:
+                       IoCompleteRequest (Irp, IO_NO_INCREMENT);
+                       return STATUS_INVALID_PARAMETER;
+       }
+       IoCompleteRequest (Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+}
+
+
+NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject,
+                            PUNICODE_STRING RegistryPath)
+/*
+ * FUNCTION: Module entry point
+ */
+{
+   PDEVICE_OBJECT DeviceObject;
+   UNICODE_STRING DeviceName;
+   UNICODE_STRING SymlinkName;
+
+   DPRINT((0,"PICE Debugger\n"));
+
+#if 0                                   // don't enable before completely ported
+#ifdef DEBUG
+    // first we enable output of debug strings to COM port
+    DebugSetupSerial(1,115200);
+#endif // DEBUG
+#endif
+
+   if(InitPICE()){
+               DriverObject->MajorFunction[IRP_MJ_CREATE] = pice_open;
+               //ei unimplemented DriverObject->MajorFunction[IRP_MJ_CLOSE] = pice_close;
+               DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = pice_ioctl;
+
+               RtlRosInitUnicodeStringFromLiteral(&DeviceName, L"\\Device\\Pice");
+               IoCreateDevice(DriverObject,
+                               0,
+                               &DeviceName,
+                               PICE_DEVICE_DEBUGGER,
+                               0,
+                               TRUE,
+                               &DeviceObject);
+               DeviceObject->Flags = DeviceObject->Flags | DO_BUFFERED_IO;
+
+               RtlRosInitUnicodeStringFromLiteral(&SymlinkName, L"\\??\\Pice");
+               IoCreateSymbolicLink(&SymlinkName, &DeviceName);
+
+               return(STATUS_SUCCESS);
+   }
+}
+