reactos/rosapps/sysutils/utils/pice/module/privateice.c

204 lines
4.8 KiB
C

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