reactos/rosapps/sysutils/utils/pice/module/utils.h

326 lines
7.7 KiB
C

/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
utils.h
Abstract:
HEADER for utils.c
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
#include <stdarg.h>
#include "../../../../ntoskrnl/include/internal/ps.h"
#define __STR(x) #x
#define STR(x) __STR(x)
typedef enum {
kbDE,
kbUS,
kbDK,
kbMaximum
} KeyboardLayout;
// scancode to ASCII conversion
typedef struct tagSCANTOASCII
{
UCHAR s; // 0 terminates the table
UCHAR a;
}SCANTOASCII, *PSCANTOASCII;
typedef struct tagKEYBOARD_LAYOUT
{
LPSTR name;
PSCANTOASCII normal;
PSCANTOASCII shifted;
PSCANTOASCII alted;
} KEYBOARD_LAYOUT, *PKEYBOARD_LAYOUT;
extern PKEYBOARD_LAYOUT CurrentKeyboard;
typedef struct _FRAME
{
ULONG error_code;
ULONG eip;
ULONG cs;
ULONG eflags;
}FRAME;
#define SHOW_FIELD_BYTE(ptr,field,wait)\
{\
if(wait && WaitForKey()==FALSE)\
return TRUE;\
PICE_sprintf(tempCmd,#field" = %.2x\n",ptr->##field);\
Print(OUTPUT_WINDOW,tempCmd);\
}
#define SHOW_FIELD_WORD(ptr,field,wait)\
{\
if(wait && WaitForKey()==FALSE)\
return TRUE;\
PICE_sprintf(tempCmd,#field" = %.4x\n",ptr->##field);\
Print(OUTPUT_WINDOW,tempCmd);\
}
#define SHOW_FIELD_DWORD(ptr,field,wait)\
{\
if(wait && WaitForKey()==FALSE)\
return TRUE;\
PICE_sprintf(tempCmd,#field" = %.8x\n",ptr->##field);\
Print(OUTPUT_WINDOW,tempCmd);\
}
#define SHOW_FIELD_SEG_OFS(ptr,field1,field2,wait)\
{\
if(wait && WaitForKey()==FALSE)\
return TRUE;\
PICE_sprintf(tempCmd,#field1":"#field2" = %.4x:%.8x\n",ptr->##field1,ptr->##field2);\
Print(OUTPUT_WINDOW,tempCmd);\
}
typedef struct _PCI_NUMBER
{
union {
struct
{
ULONG res2 : 2;
ULONG reg : 6; // 64 regs per function
ULONG func : 3; // 8 functions per device
ULONG dev : 5; // 32 device per bus
ULONG bus : 8; // 256 buses
ULONG res1 : 7;
ULONG ce : 1; // 1 to enable
}bits;
ULONG AsUlong;
}u;
}PCI_NUMBER;
/*
typedef struct _PCI_COMMON_CONFIG {
USHORT VendorID; // (ro)
USHORT DeviceID; // (ro)
USHORT Command; // Device control
USHORT Status;
UCHAR RevisionID; // (ro)
UCHAR ProgIf; // (ro)
UCHAR SubClass; // (ro)
UCHAR BaseClass; // (ro)
UCHAR CacheLineSize; // (ro+)
UCHAR LatencyTimer; // (ro+)
UCHAR HeaderType; // (ro)
UCHAR BIST; // Built in self test
ULONG BaseAddresses[6];
ULONG CIS;
USHORT SubVendorID;
USHORT SubSystemID;
ULONG ROMBaseAddress;
UCHAR CapabilitiesPtr;
UCHAR Reserved1[3];
ULONG Reserved2;
UCHAR InterruptLine; //
UCHAR InterruptPin; // (ro)
UCHAR MinimumGrant; // (ro)
UCHAR MaximumLatency; // (ro)
}PCI_COMMON_CONFIG;
*/
typedef struct tagPageDir
{
ULONG P :1;
ULONG RW :1;
ULONG US :1;
ULONG PWT :1;
ULONG PCD :1;
ULONG A :1;
ULONG dummy :1;
ULONG PS :1;
ULONG G :1;
ULONG Avail :3;
ULONG PTBase :20;
}PAGEDIR,*PPAGEDIR;
typedef struct tagGdt
{
ULONG Limit_15_0 :16;
ULONG Base_15_0 :16;
ULONG Base_23_16 :8;
ULONG SegType :4;
ULONG DescType :1;
ULONG Dpl :2;
ULONG Present :1;
ULONG Limit_19_16 :4;
ULONG Avl :1;
ULONG Reserved :1;
ULONG DefOp :1;
ULONG Gran :1;
ULONG Base_31_24 :8;
}GDT,*PGDT;
typedef struct tagIdt
{
ULONG Offset_15_0 :16;
ULONG Selector :16;
ULONG Reserved :8;
ULONG DescType :5;
ULONG Dpl :2;
ULONG Present :1;
ULONG Offset_31_16 :16;
}IDT,*PIDT;
typedef struct tagDESCRIPTOR
{
USHORT Cpl :2; // current privilege level
USHORT Ti :1; // table index (GDT=0 LDT=1)
USHORT Val :13; // index into table
}DESCRIPTOR,*PDESCRIPTOR;
PKEYBOARD_LAYOUT GetKeyboardLayout();
PKEYBOARD_LAYOUT SetKeyboardLayoutByName(LPSTR Name);
void PICE_memset(void* p,unsigned char c,int sz);
void PICE_memcpy(void* t,void* s,int sz);
char *PICE_strrev(char *);
ULONG PICE_strcmp(char* s1,char* s2);
ULONG PICE_strcmpi(char* s1,char* s2);
ULONG PICE_strncmpi(char* s1,char* s2,ULONG len);
USHORT PICE_strlen(const char* s);
char* PICE_strcat(char* s1,char* s2);
BOOLEAN PICE_isprint(char c);
char* PICE_strcpy(char* s1,char* s2);
char* PICE_strncpy(char* s1,char* s2,int len);
char* PICE_strchr(char* s,char c);
int PICE_isdigit( int c );
int PICE_isxdigit( int c );
int PICE_islower( int c );
int PICE_isalpha( int c );
int PICE_sprintf(char * buf, const char *fmt, ...);
int PICE_vsprintf(char *buf, const char *fmt, va_list args);
BOOLEAN IsAddressValid(ULONG Addr);
BOOLEAN IsAddressWriteable(ULONG Addr);
BOOLEAN SetAddressWriteable(ULONG address,BOOLEAN bSet);
BOOLEAN IsRangeValid(ULONG addr,ULONG Length);
void IntelStackWalk(ULONG pc,ULONG ebp,ULONG esp);
ULONG ReadPhysMem(ULONG Address,ULONG ulSize);
void WritePhysMem(ULONG Address,ULONG Datum,ULONG ulSize);
BOOLEAN IsRetAtEIP(void);
BOOLEAN IsCallInstrAtEIP(void);
ULONG GetLinearAddress(USHORT Segment,ULONG Offset);
#define OUTPUT_BUFFER_FULL 0x01
#define INPUT_BUFFER_FULL 0x02
#define MOUSE_OUTPUT_BUFFER_FULL 0x20
void ShowStoppedMsg(void);
void ShowRunningMsg(void);
void SetHardwareBreakPoints(void);
void SetHardwareBreakPoint(ULONG ulAddress,ULONG ulReg);
// this should be in disasm.h but someone misused the header files
BOOLEAN Disasm(PULONG pOffset, PUCHAR pchDst);
//////////////////////////////////////////////////////////////////
//segments defined in \include\napi\i386\segment.h
#define GLOBAL_CODE_SEGMENT (KERNEL_CS)
#define GLOBAL_DATA_SEGMENT (KERNEL_DS)
//#define OVR_CS .byte 0x2e
//#define OVR_FS .byte 0x64
void DisplayRegs(void);
void SaveOldRegs(void);
BOOLEAN CheckLoadAbort(void);
UCHAR KeyboardGetKeyPolled(void);
void KeyboardFlushKeyboardQueue(void);
#define _PAGE_PRESENT 0x001
#define _PAGE_RW 0x002
#define _PAGE_USER 0x004
#define _PAGE_PWT 0x008
#define _PAGE_PCD 0x010
#define _PAGE_ACCESSED 0x020
#define _PAGE_DIRTY 0x040
#define _PAGE_PSE 0x080
#define _PAGE_4M _PAGE_PSE
#define _PAGE_SIZE 0x1000
UCHAR AsciiFromScan(UCHAR s);
UCHAR AsciiToScan(UCHAR s);
void outportb(PUCHAR port,UCHAR data);
UCHAR inportb(PUCHAR port);
void outb_p(UCHAR data, PUCHAR port);
UCHAR inb_p(PUCHAR port);
VOID outl(ULONG l, PULONG port);
ULONG inl(PULONG port);
#define save_flags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
#define restore_flags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc")
#define cli() __asm__ __volatile__("cli": : :"memory")
#define sti() __asm__ __volatile__("sti": : :"memory")
#ifdef NDEBUG
#define ASSERT(x)
#else
#define ASSERT(x) if (!(x)) { DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__); KeBugCheck(0); }
#endif
//extern unsigned long sys_call_table[];
//struct mm_struct *GetInitMm(void);
PMADDRESS_SPACE my_init_mm;
LIST_ENTRY* pPsProcessListHead;
void EnablePassThrough(void);
#define PAGEDPOOL (1)
#define NONPAGEDPOOL (0)
void * PICE_malloc( size_t numBytes, BOOLEAN fromPaged );
void PICE_free( void* p );
HANDLE PICE_open (LPCWSTR lpPathName, int iReadWrite);
long PICE_read(HANDLE hFile, LPVOID lpBuffer, long lBytes);
int PICE_close (HANDLE hFile);
size_t PICE_len( HANDLE hFile );
WCHAR * PICE_wcscpy(WCHAR * str1,const WCHAR * str2);
INT
STDCALL
PICE_MultiByteToWideChar (
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);