--- /dev/null
+/*++
+
+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);
+ }
+}
+