mirror of
https://github.com/reactos/reactos.git
synced 2024-09-10 21:04:26 +00:00
204 lines
4.8 KiB
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);
|
||
|
}
|
||
|
}
|
||
|
|