delete the old apps folder

svn path=/trunk/; revision=21108
This commit is contained in:
Ged Murphy
2006-02-17 18:43:24 +00:00
parent 7700cdaa42
commit eea301c1f7
136 changed files with 0 additions and 41701 deletions
-3
View File
@@ -1,3 +0,0 @@
<directory name="utils">
<xi:include href="utils/directory.xml" />
</directory>
-223
View File
@@ -1,223 +0,0 @@
/*
* ReactOS test program -
*
* loadlib.c
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <windows.h>
#include "loadlib.h"
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#define APP_VERSION 1
#define MAX_LIBS 25
#ifdef UNICODE
#define TARGET "UNICODE"
BOOL bUseAnsi = FALSE;
#else
#define TARGET "MBCS"
BOOL bUseAnsi = TRUE;
#endif
BOOL verbose_flagged = FALSE;
BOOL debug_flagged = FALSE;
BOOL loop_flagged = FALSE;
BOOL recursive_flagged = FALSE;
HANDLE OutputHandle;
HANDLE InputHandle;
void dprintf(char* fmt, ...)
{
va_list args;
char buffer[255];
va_start(args, fmt);
wvsprintfA(buffer, fmt, args);
WriteConsoleA(OutputHandle, buffer, lstrlenA(buffer), NULL, NULL);
va_end(args);
}
long getinput(char* buf, int buflen)
{
DWORD result;
ReadConsoleA(InputHandle, buf, buflen, &result, NULL);
return (long)result;
}
DWORD ReportLastError(void)
{
DWORD dwError = GetLastError();
if (dwError != ERROR_SUCCESS) {
PSTR msg = NULL;
if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
0, dwError, MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (PSTR)&msg, 0, NULL)) {
if (msg != NULL) {
dprintf("ReportLastError() %d - %s\n", dwError, msg);
} else {
dprintf("ERROR: ReportLastError() %d - returned TRUE but with no msg string!\n", dwError);
}
} else {
dprintf("ReportLastError() %d - unknown error\n", dwError);
}
if (msg != NULL) {
LocalFree(msg);
}
}
return dwError;
}
const char* appName(const char* argv0)
{
const char* name;
name = (const char*)strrchr(argv0, '\\');
if (name != NULL)
return name + 1;
return argv0;
}
int usage(const char* appName)
{
dprintf("USAGE: %s libname [libname ...] [unicode]|[ansi] [loop][recurse]\n", appName);
dprintf("\tWhere libname(s) is one or more libraries to load.\n");
dprintf("\t[unicode] - perform tests using UNICODE api calls\n");
dprintf("\t[ansi] - perform tests using ANSI api calls\n");
dprintf("\t default is %s\n", TARGET);
dprintf("\t[loop] - run test process in continuous loop\n");
dprintf("\t[recurse] - load libraries recursively rather than sequentually\n");
dprintf("\t[debug] - enable debug mode (unused)\n");
dprintf("\t[verbose] - enable verbose output (unused)\n");
return 0;
}
DWORD LoadLibraryList(char** libnames, int counter, BOOL bUseAnsi)
{
HMODULE hModule;
dprintf("Attempting to LoadLibrary");
if (bUseAnsi) {
dprintf("A(%s) - ", *libnames);
hModule = LoadLibraryA(*libnames);
} else {
int len;
wchar_t libnameW[500];
len = mbstowcs(libnameW, *libnames, strlen(*libnames));
if (len) {
libnameW[len] = L'\0';
dprintf("W(%S) - ", libnameW);
hModule = LoadLibraryW(libnameW);
} else {
return ERROR_INVALID_PARAMETER;
}
}
if (hModule == NULL) {
dprintf("\nERROR: failed to obtain handle to module %s - %x\n", *libnames, hModule);
return ReportLastError();
}
dprintf("%x\n", hModule);
if (counter--) {
LoadLibraryList(++libnames, counter, bUseAnsi);
}
if (!FreeLibrary(hModule)) {
dprintf("ERROR: failed to free module %s - %x\n", *libnames, hModule);
return ReportLastError();
} else {
dprintf("FreeLibrary(%x) - successfull.\n", hModule);
}
return 0L;
}
int __cdecl main(int argc, char* argv[])
{
char* libs[MAX_LIBS];
int lib_count = 0;
int result = 0;
int i = 0;
AllocConsole();
InputHandle = GetStdHandle(STD_INPUT_HANDLE);
OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
dprintf("%s application - build %03d (default: %s)\n", appName(argv[0]), APP_VERSION, TARGET);
if (argc < 2) {
/*return */usage(appName(argv[0]));
}
memset(libs, 0, sizeof(libs));
for (i = 1; i < argc; i++) {
if (lstrcmpiA(argv[i], "ansi") == 0) {
bUseAnsi = TRUE;
} else if (lstrcmpiA(argv[i], "unicode") == 0) {
bUseAnsi = FALSE;
} else if (lstrcmpiA(argv[i], "loop") == 0) {
loop_flagged = 1;
} else if (lstrcmpiA(argv[i], "recurse") == 0) {
recursive_flagged = 1;
} else if (lstrcmpiA(argv[i], "verbose") == 0) {
verbose_flagged = 1;
} else if (lstrcmpiA(argv[i], "debug") == 0) {
debug_flagged = 1;
} else {
if (lib_count < MAX_LIBS) {
libs[lib_count] = argv[i];
++lib_count;
}
}
}
if (lib_count) {
do {
if (recursive_flagged) {
result = LoadLibraryList(libs, lib_count - 1, bUseAnsi);
} else {
for (i = 0; i < lib_count; i++) {
result = LoadLibraryList(&libs[i], 0, bUseAnsi);
//if (result != 0) break;
}
}
} while (loop_flagged);
} else {
int len;
char buffer[500];
do {
dprintf("\nEnter library name to attempt loading: ");
len = getinput(buffer, sizeof(buffer) - 1);
if (len > 2) {
char* buf = buffer;
buffer[len-2] = '\0';
result = LoadLibraryList(&buf, 0, bUseAnsi);
} else break;
} while (!result && len);
}
dprintf("finished\n");
return result;
}
#ifdef _NOCRT
char* args[] = { "loadlib.exe", "advapi32.dll", "user32.dll", "recurse"};
int __cdecl mainCRTStartup(void)
{
return main(3, args);
}
#endif /*__GNUC__*/
-45
View File
@@ -1,45 +0,0 @@
/*
* ReactOS test program -
*
* loadlib.h
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __LOADLIB_H__
#define __LOADLIB_H__
#ifdef __cplusplus
extern "C" {
#endif
extern BOOL verbose_flagged;
extern BOOL debug_flagged;
extern BOOL loop_flagged;
extern BOOL recursive_flagged;
DWORD ReportLastError(void);
long getinput(char* Buffer, int buflen);
void dprintf(char* fmt, ...);
#ifdef __cplusplus
};
#endif
#endif // __LOADLIB_H__
@@ -1,421 +0,0 @@
/*
* ReactOS test program -
*
* _tfileio.c
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <wchar.h>
#include <stdio.h>
#ifdef UNICODE
#define _tfopen _wfopen
#define _tunlink _wunlink
#define _TEOF WEOF
#define _gettchar getwchar
#define _puttchar putwchar
#define _THEX_FORMAT _T("0x%04x ")
#else /*UNICODE*/
#define _tfopen fopen
#define _tunlink _unlink
#define _TEOF EOF
#define _gettchar getchar
#define _puttchar putchar
#define _THEX_FORMAT "0x%02x "
#endif /*UNICODE*/
#define TEST_BUFFER_SIZE 200
#define TEST_FILE_LINES 4
extern BOOL verbose_flagged;
extern BOOL status_flagged;
static TCHAR test_buffer[TEST_BUFFER_SIZE];
static TCHAR dos_data[] = _T("line1: this is a bunch of readable text.\r\n")\
_T("line2: some more printable text and punctuation !@#$%^&*()\r\n")\
_T("line3: followed up with some numerals 1234567890\r\n")\
_T("line4: done.\r\n");
static TCHAR nix_data[] = _T("line1: this is a bunch of readable text.\n")\
_T("line2: some more printable text and punctuation !@#$%^&*()\n")\
_T("line3: followed up with some numerals 1234567890\n")\
_T("line4: done.\n");
#ifdef UNICODE
#define TEST_B1_FILE_SIZE ((((sizeof(dos_data)/2)-1)+TEST_FILE_LINES)/2) // (166+4)/2=85
#define TEST_B2_FILE_SIZE (((sizeof(dos_data)/2)-1)*2) // (166*2) =332
#define TEST_B3_FILE_SIZE ((((sizeof(nix_data)/2)-1)+TEST_FILE_LINES)/2) // (162+4)/2=83
#define TEST_B4_FILE_SIZE (((sizeof(nix_data)/2)-1)*2) // (162*2) =324
#else /*UNICODE*/
#define TEST_B1_FILE_SIZE (sizeof(dos_data)-1+TEST_FILE_LINES) // (166+4)=170
#define TEST_B2_FILE_SIZE (sizeof(dos_data)-1-TEST_FILE_LINES) // (166-4)=162
#define TEST_B3_FILE_SIZE (sizeof(nix_data)-1+TEST_FILE_LINES) // (162+4)=166
#define TEST_B4_FILE_SIZE (sizeof(nix_data)-1) // (162) =162
#endif /*UNICODE*/
// result = create_test_file(file_name, _T("wb"), _T("rb"), file_data);
static BOOL test_file_truncate(TCHAR* file_name)
{
BOOL result = FALSE;
int count = -1;
int error_code;
TCHAR ch;
TCHAR* file_data = _T("this file should have been truncated to zero bytes...");
FILE *file = _tfopen(file_name, _T("wb"));
if (verbose_flagged) {
_tprintf(_T("test_file_truncate(\"%s\")\n"), file_name);
}
if (file != NULL) {
if (_fputts(file_data, file) != _TEOF) {
} else {
_tprintf(_T("ERROR: failed to write data to file \"%s\"\n"), file_name);
_tprintf(_T("ERROR: ferror returned %d\n"), ferror(file));
}
fclose(file);
} else {
_tprintf(_T("ERROR: failed to open/create file \"%s\" for output\n"), file_name);
_tprintf(_T("ERROR: ferror returned %d\n"), ferror(file));
}
file = _tfopen(file_name, _T("wb"));
if (file != NULL) {
error_code = ferror(file);
if (error_code) {
_tprintf(_T("ERROR: (%s) ferror returned %d\n"), file_name, error_code);
}
fclose(file);
} else {
_tprintf(_T("ERROR: (%s) failed to open file for truncating\n"), file_name);
}
file = _tfopen(file_name, _T("rb"));
if (file != NULL) {
count = 0;
while ((ch = _fgettc(file)) != _TEOF) {
if (verbose_flagged) {
_tprintf(_THEX_FORMAT, ch);
}
++count;
}
error_code = ferror(file);
if (error_code) {
_tprintf(_T("ERROR: (%s) ferror returned %d after reading\n"), file_name, error_code);
perror("Read error");
}
fclose(file);
} else {
_tprintf(_T("ERROR: (%s) failed to open file for reading\n"), file_name);
}
if (count) {
result = TRUE;
}
return result;
}
static BOOL create_output_file(TCHAR* file_name, TCHAR* file_mode, TCHAR* file_data)
{
BOOL result = FALSE;
FILE *file = _tfopen(file_name, file_mode);
if (file != NULL) {
if (_fputts(file_data, file) != _TEOF) {
result = TRUE;
} else {
_tprintf(_T("ERROR: failed to write data to file \"%s\"\n"), file_name);
_tprintf(_T("ERROR: ferror returned %d\n"), ferror(file));
}
fclose(file);
} else {
_tprintf(_T("ERROR: failed to open/create file \"%s\" for output\n"), file_name);
_tprintf(_T("ERROR: ferror returned %d\n"), ferror(file));
}
return result;
}
static BOOL verify_output_file(TCHAR* file_name, TCHAR* file_mode, TCHAR* file_data)
{
int error_code;
int offset = 0;
int line_num = 0;
BOOL result = FALSE;
BOOL error_flagged = FALSE;
FILE* file = _tfopen(file_name, file_mode);
if (file == NULL) {
_tprintf(_T("ERROR: (%s) Can't open file for reading\n"), file_name);
_tprintf(_T("ERROR: ferror returned %d\n"), ferror(file));
return FALSE;
} else if (status_flagged) {
_tprintf(_T("STATUS: (%s) opened file for reading\n"), file_name);
}
while (_fgetts(test_buffer, TEST_BUFFER_SIZE, file)) {
int length = _tcslen(test_buffer);
int req_len = _tcschr(file_data+offset, _T('\n')) - (file_data+offset) + 1;
++line_num;
if (length > req_len) {
_tprintf(_T("ERROR: read excess bytes from line %d, length %d, but expected %d\n"), line_num, length, req_len);
error_flagged = TRUE;
break;
}
if (length < req_len) {
_tprintf(_T("ERROR: read to few bytes from line %d, length %d, but expected %d\n"), line_num, length, req_len);
error_flagged = TRUE;
break;
}
if (status_flagged) {
_tprintf(_T("STATUS: Verifying %d bytes read from line %d\n"), length, line_num);
}
if (_tcsncmp(test_buffer, file_data+offset, length - 1) == 0) {
result = TRUE;
} else {
if (status_flagged) {
int i;
_tprintf(_T("WARNING: (%s) failed to verify file\n"), file_name);
for (i = 0; i < length; i++) {
if (file_data[offset+i] != test_buffer[i]) {
_tprintf(_T("line %d, offset %d expected: 0x%04x found: 0x%04x\n"), line_num, i, (int)file_data[offset+i], (int)test_buffer[i]);
}
}
_tprintf(_T("\n"));
} else {
error_flagged = TRUE;
}
}
offset += length;
}
error_code = ferror(file);
if (error_code) {
_tprintf(_T("ERROR: (%s) ferror returned %d after reading\n"), file_name, error_code);
perror("Read error");
}
if (!line_num) {
_tprintf(_T("ERROR: (%s) failed to read from file\n"), file_name);
}
if (error_flagged == TRUE) {
_tprintf(_T("ERROR: (%s) failed to verify file\n"), file_name);
result = FALSE;
}
fclose(file);
return result;
}
static int create_test_file(TCHAR* file_name, TCHAR* write_mode, TCHAR* read_mode, TCHAR* file_data)
{
if (status_flagged) {
_tprintf(_T("STATUS: Attempting to create output file %s\n"), file_name);
}
if (create_output_file(file_name, write_mode, file_data)) {
if (status_flagged) {
_tprintf(_T("STATUS: Attempting to verify output file %s\n"), file_name);
}
if (verify_output_file(file_name, read_mode, file_data)) {
if (status_flagged) {
_tprintf(_T("SUCCESS: %s verified ok\n"), file_name);
}
} else {
//_tprintf(_T("ERROR: failed to verify file %s\n"), file_name);
return 2;
}
} else {
_tprintf(_T("ERROR: failed to create file %s\n"), file_name);
return 1;
}
return 0;
}
static int check_file_size(TCHAR* file_name, TCHAR* file_mode, int expected)
{
int count = 0;
FILE* file;
TCHAR ch;
int error_code;
if (status_flagged) {
//_tprintf(_T("STATUS: (%s) checking for %d bytes in %s mode\n"), file_name, expected, _tcschr(file_mode, _T('b')) ? _T("binary") : _T("text"));
_tprintf(_T("STATUS: (%s) checking for %d bytes with mode %s\n"), file_name, expected, file_mode);
}
file = _tfopen(file_name, file_mode);
if (file == NULL) {
_tprintf(_T("ERROR: (%s) failed to open file for reading\n"), file_name);
return 1;
}
while ((ch = _fgettc(file)) != _TEOF) {
if (verbose_flagged) {
_tprintf(_THEX_FORMAT, ch);
}
++count;
}
error_code = ferror(file);
if (error_code) {
_tprintf(_T("ERROR: (%s) ferror returned %d after reading\n"), file_name, error_code);
perror("Read error");
}
if (verbose_flagged) {
// _puttc(_T('\n'), stdout);
}
fclose(file);
if (count == expected) {
if (status_flagged) {
_tprintf(_T("PASSED: (%s) read %d bytes\n"), file_name, count);
}
} else {
_tprintf(_T("FAILED: (%s) read %d bytes but expected %d using mode \"%s\"\n"), file_name, count, expected, file_mode);
}
return (count == expected) ? 0 : -1;
}
static int test_console_io(void)
{
TCHAR buffer[81];
TCHAR ch;
int i, j;
_tprintf(_T("Enter a line for echoing:\n"));
//for (i = 0; (i < 80) && ((ch = _gettchar()) != _TEOF) && (ch != _T('\n')); i++) {
for (i = 0; (i < 80) && ((ch = _gettc(stdin)) != _TEOF) && (ch != _T('\n')); i++) {
buffer[i] = (TCHAR)ch;
}
buffer[i] = _T('\0');
for (j = 0; j < i; j++) {
_puttc(buffer[j], stdout);
}
_puttc(_T('\n'), stdout);
_tprintf(_T("%s\n"), buffer);
return 0;
}
static int test_console_getchar(void)
{
int result = 0;
TCHAR ch;
_tprintf(_T("Enter lines for dumping or <ctrl-z><nl> to finish:\n"));
//while ((ch = _gettchar()) != _TEOF) {
while ((ch = _gettc(stdin)) != _TEOF) {
_tprintf(_THEX_FORMAT, ch);
//printf("0x%04x ", ch);
}
return result;
}
static int test_console_putch(void)
{
int result = 0;
_putch('1');
_putch('@');
_putch('3');
_putch(':');
_putch('\n');
_putch('a');
_putch('B');
_putch('c');
_putch(':');
_putch('\n');
return result;
}
static int test_unlink_files(void)
{
int result = 0;
//printf("sizeof dos_data: %d\n", sizeof(dos_data));
//printf("sizeof nix_data: %d\n", sizeof(nix_data));
result |= _tunlink(_T("binary.dos"));
result |= _tunlink(_T("binary.nix"));
result |= _tunlink(_T("text.dos"));
result |= _tunlink(_T("text.nix"));
return result;
}
static int test_text_fileio(TCHAR* file_name, TCHAR* file_data, int tsize, int bsize)
{
int result = 0;
result = create_test_file(file_name, _T("w"), _T("r"), file_data);
result = check_file_size(file_name, _T("r"), tsize);
result = check_file_size(file_name, _T("rb"), bsize);
return result;
}
static int test_binary_fileio(TCHAR* file_name, TCHAR* file_data, int tsize, int bsize)
{
int result = 0;
result = create_test_file(file_name, _T("wb"), _T("rb"), file_data);
result = check_file_size(file_name, _T("r"), tsize);
result = check_file_size(file_name, _T("rb"), bsize);
return result;
}
static int test_files(int test_num, char* type)
{
int result = 0;
printf("performing test: %d (%s)\n", test_num, type);
if (test_file_truncate(_T("zerosize.foo"))) {
printf("System unable to truncate files yet, unlinking:\n");
test_unlink_files();
}
switch (test_num) {
case 1:
result = test_text_fileio(_T("text.dos"), dos_data, 166, TEST_B1_FILE_SIZE);
break;
case 2:
result = test_binary_fileio(_T("binary.dos"), dos_data, TEST_B2_FILE_SIZE, 166);
break;
case 3:
result = test_text_fileio(_T("text.nix"), nix_data, 162, TEST_B3_FILE_SIZE);
break;
case 4:
result = test_binary_fileio(_T("binary.nix"), nix_data, TEST_B4_FILE_SIZE, 162);
break;
case 5:
result = test_console_io();
break;
case 6:
result = test_console_getchar();
break;
case 7:
result = test_console_putch();
break;
case -1:
result = test_unlink_files();
break;
default:
_tprintf(_T("no test number selected\n"));
break;
}
return result;
}
@@ -1,31 +0,0 @@
/*
* ReactOS test program -
*
* _fileio.c
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#undef UNICODE
#undef _UNICODE
#include "_tfileio.c"
int run_ansi_tests(int test_num)
{
return test_files(test_num, "ANSI");
}
-124
View File
@@ -1,124 +0,0 @@
/*
* ReactOS test program -
*
* main.c
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <wchar.h>
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#define VERSION 1
#ifdef UNICODE
#define TARGET "UNICODE"
#else
#define TARGET "MBCS"
#endif
BOOL verbose_flagged = 0;
BOOL status_flagged = 0;
int usage(char* argv0)
{
printf("USAGE: %s test_id [unicode]|[ansi] [clean]|[status][verbose]\n", argv0);
printf("\tWhere test_id is one of:\n");
printf("\t0 - (default) regression mode, run tests 1-4 displaying failures only\n");
printf("\t1 - Write DOS style eol data to file in text mode (text.dos)\n");
printf("\t2 - Write NIX style eol data to file in binary mode (binary.dos)\n");
printf("\t3 - Write DOS style eol data to file in text mode (text.nix)\n");
printf("\t4 - Write NIX style eol data to file in binary mode (binary.nix)\n");
printf("\t5 - Echo console line input\n");
printf("\t6 - Dump console line input in hex format\n");
printf("\t7 - The source code is your friend\n");
printf("\t[unicode] - perform tests using UNICODE versions of library functions\n");
printf("\t[ansi] - perform tests using ANSI versions of library functions\n");
printf("\t If neither unicode or ansi is specified build default is used\n");
printf("\t[clean] - delete all temporary test output files\n");
printf("\t[status] - enable extra status display while running\n");
printf("\t[verbose] - enable verbose output when running\n");
return 0;
}
int __cdecl main(int argc, char* argv[])
{
int test_num = 0;
int version = 0;
int result = 0;
int i = 0;
printf("%s test application - build %03d (default: %s)\n", argv[0], VERSION, TARGET);
if (argc < 2) {
return usage(argv[0]);
}
for (i = 1; i < argc; i++) {
if (strstr(argv[i], "ansi") || strstr(argv[i], "ANSI")) {
version = 1;
} else if (strstr(argv[i], "unicode") || strstr(argv[i], "UNICODE")) {
version = 2;
} else if (strstr(argv[i], "clean") || strstr(argv[i], "CLEAN")) {
test_num = -1;
} else if (strstr(argv[i], "verbose") || strstr(argv[i], "VERBOSE")) {
verbose_flagged = 1;
} else if (strstr(argv[i], "status") || strstr(argv[i], "STATUS")) {
status_flagged = 1;
} else {
test_num = atoi(argv[1]);
//if (test_num < 0
}
}
for (i = test_num; i <= test_num; i++) {
if (!test_num) {
test_num = 4;
i = 1;
}
switch (version) {
case 1:
result = run_ansi_tests(i);
break;
case 2:
result = run_unicode_tests(i);
break;
default:
result = run_ansi_tests(i);
result = run_unicode_tests(i);
break;
}
}
printf("finished\n");
return result;
}
#ifndef __GNUC__
char* args[] = { "fileio.exe", "0", "unicode", "verbose"};
int __cdecl mainCRTStartup(void)
{
main(2, args);
return 0;
}
#endif /*__GNUC__*/
@@ -1,42 +0,0 @@
/*
* ReactOS test program -
*
* main.h
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __MAIN_H__
#define __MAIN_H__
#ifdef __cplusplus
extern "C" {
#endif
int app_main(int argc, char* argv[]);
DWORD GetInput(char* Buffer, int buflen);
int test_ansi_files(int test_num);
int test_unicode_files(int test_num);
#ifdef __cplusplus
};
#endif
#endif // __MAIN_H__
@@ -1,31 +0,0 @@
/*
* ReactOS test program -
*
* wfileio.c
*
* Copyright (C) 2002 Robert Dickenson <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define UNICODE
#define _UNICODE
#include "_tfileio.c"
int run_unicode_tests(int test_num)
{
return test_files(test_num, "UNICODE");
}
-615
View File
@@ -1,615 +0,0 @@
#include <conio.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
/** DEFINES *******************************************************************/
#define PATCH_BUFFER_SIZE 4096 /* Maximum size of a patch */
#define PATCH_BUFFER_MAGIC "\xde\xad\xbe\xef MaGiC MaRk "
#define SIZEOF_PATCH_BUFFER_MAGIC (sizeof (PATCH_BUFFER_MAGIC) - 1)
/** TYPES *********************************************************************/
typedef struct _PatchedByte
{
int offset; /*!< File offset of the patched byte. */
unsigned char expected; /*!< Expected (original) value of the byte. */
unsigned char patched; /*!< Patched (new) value for the byte. */
} PatchedByte;
typedef struct _PatchedFile
{
const char *name; /*!< Name of the file to be patched. */
int fileSize; /*!< Size of the file in bytes. */
int patchCount; /*!< Number of patches for the file. */
PatchedByte *patches; /*!< Patches for the file. */
} PatchedFile;
typedef struct _Patch
{
const char *name; /*!< Name of the patch. */
int fileCount; /*!< Number of files in the patch. */
PatchedFile *files; /*!< Files for the patch. */
} Patch;
/** FUNCTION PROTOTYPES *******************************************************/
static void printUsage();
/** GLOBALS *******************************************************************/
static Patch m_patch = { NULL, 0, NULL };
static int m_argc = 0;
static char **m_argv = NULL;
/* patch buffer where we put the patch info into */
static unsigned char m_patchBuffer[SIZEOF_PATCH_BUFFER_MAGIC + PATCH_BUFFER_SIZE] =
PATCH_BUFFER_MAGIC;
/** HELPER FUNCTIONS **********************************************************/
static void *
loadFile(const char *fileName, int *fileSize_)
{
FILE *f;
struct stat sb;
int fileSize;
void *p;
/* Open the file */
f = fopen(fileName, "rb");
if (f == NULL)
{
printf("Couldn't open file %s for reading!\n", fileName);
return NULL;
}
/* Get file size */
if (fstat(fileno(f), &sb) < 0)
{
fclose(f);
printf("Couldn't get size of file %s!\n", fileName);
return NULL;
}
fileSize = sb.st_size;
/* Load file */
p = malloc(fileSize);
if (p == NULL)
{
fclose(f);
printf("Couldn't allocate %d bytes for file %s!\n", fileSize, fileName);
return NULL;
}
if (fread(p, fileSize, 1, f) != 1)
{
fclose(f);
free(p);
printf("Couldn't read file %s into memory!\n", fileName);
return NULL;
}
/* Close file */
fclose(f);
*fileSize_ = fileSize;
return p;
}
static int
saveFile(const char *fileName, void *file, int fileSize)
{
FILE *f;
/* Open the file */
f = fopen(fileName, "wb");
if (f == NULL)
{
printf("Couldn't open file %s for writing!\n", fileName);
return -1;
}
/* Write file */
if (fwrite(file, fileSize, 1, f) != 1)
{
fclose(f);
printf("Couldn't write file %s!\n", fileName);
return -1;
}
/* Close file */
fclose(f);
return 0;
}
static int
compareFiles(
PatchedFile *patchedFile,
const char *originalFileName)
{
const char *patchedFileName = patchedFile->name;
unsigned char *origChunk, *patchedChunk;
int origSize, patchedSize, i, patchCount;
PatchedByte *patches = NULL;
int patchesArrayCount = 0;
/* Load both files */
origChunk = loadFile(originalFileName, &origSize);
if (origChunk == NULL)
return -1;
patchedChunk = loadFile(patchedFileName, &patchedSize);
if (patchedChunk == NULL)
{
free(origChunk);
return -1;
}
if (origSize != patchedSize)
{
free(origChunk);
free(patchedChunk);
printf("File size of %s and %s differs (%d != %d)\n",
originalFileName, patchedFileName,
origSize, patchedSize);
return -1;
}
/* Compare the files and record any differences */
printf("Comparing %s to %s", originalFileName, patchedFileName);
for (i = 0, patchCount = 0; i < origSize; i++)
{
if (origChunk[i] != patchedChunk[i])
{
patchCount++;
/* Resize patches array if needed */
if (patchesArrayCount < patchCount)
{
PatchedByte *newPatches;
newPatches = realloc(patches, patchCount * sizeof (PatchedByte));
if (newPatches == NULL)
{
if (patches != NULL)
free(patches);
free(origChunk);
free(patchedChunk);
printf("\nOut of memory (tried to allocated %d bytes)\n",
patchCount * sizeof (PatchedByte));
return -1;
}
patches = newPatches;
}
/* Fill in patch info */
patches[patchCount - 1].offset = i;
patches[patchCount - 1].expected = origChunk[i];
patches[patchCount - 1].patched = patchedChunk[i];
}
if ((i % (origSize / 40)) == 0)
printf(".");
}
printf(" %d changed bytes found.\n", patchCount);
/* Unload the files */
free(origChunk);
free(patchedChunk);
/* Save patch info */
patchedFile->fileSize = patchedSize;
patchedFile->patchCount = patchCount;
patchedFile->patches = patches;
return 0;
}
static int
outputPatch(const char *outputFileName)
{
unsigned char *patchExe, *patchBuffer;
int i, size, patchExeSize, patchSize, stringSize, stringOffset, patchOffset;
Patch *patch;
PatchedFile *files;
printf("Putting patch into %s...\n", outputFileName);
/* Calculate size of the patch */
patchSize = sizeof (Patch) + sizeof (PatchedFile) * m_patch.fileCount;
stringSize = strlen(m_patch.name) + 1;
for (i = 0; i < m_patch.fileCount; i++)
{
stringSize += strlen(m_patch.files[i].name) + 1;
patchSize += sizeof (PatchedByte) * m_patch.files[i].patchCount;
}
if ((stringSize + patchSize) > PATCH_BUFFER_SIZE)
{
printf("Patch is too big - %d bytes maximum, %d bytes needed\n",
PATCH_BUFFER_SIZE, stringSize + patchSize);
return -1;
}
/* Load patch.exe file into memory... */
patchExe = loadFile(m_argv[0], &patchExeSize);
if (patchExe == NULL)
{
return -1;
}
/* Try to find the magic mark for the patch buffer */
for (i = 0; i < (patchExeSize - SIZEOF_PATCH_BUFFER_MAGIC); i++)
{
if (memcmp(patchExe + i, m_patchBuffer, SIZEOF_PATCH_BUFFER_MAGIC) == 0)
{
patchBuffer = patchExe + i + SIZEOF_PATCH_BUFFER_MAGIC;
break;
}
}
if (!(i < (patchExeSize - SIZEOF_PATCH_BUFFER_MAGIC)))
{
free(patchExe);
printf("Couldn't find patch buffer magic in file %s - this shouldn't happen!!!\n", m_argv[0]);
return -1;
}
/* Pack patch together and replace string pointers by offsets */
patch = (Patch *)patchBuffer;
files = (PatchedFile *)(patchBuffer + sizeof (Patch));
patchOffset = sizeof (Patch) + sizeof (PatchedFile) * m_patch.fileCount;
stringOffset = patchSize;
patch->fileCount = m_patch.fileCount;
patch->files = (PatchedFile *)sizeof (Patch);
patch->name = (const char *)stringOffset;
strcpy(patchBuffer + stringOffset, m_patch.name);
stringOffset += strlen(m_patch.name) + 1;
for (i = 0; i < m_patch.fileCount; i++)
{
files[i].fileSize = m_patch.files[i].fileSize;
files[i].patchCount = m_patch.files[i].patchCount;
files[i].name = (const char *)stringOffset;
strcpy(patchBuffer + stringOffset, m_patch.files[i].name);
stringOffset += strlen(m_patch.files[i].name) + 1;
size = files[i].patchCount * sizeof (PatchedByte);
files[i].patches = (PatchedByte *)patchOffset;
memcpy(patchBuffer + patchOffset, m_patch.files[i].patches, size);
patchOffset += size;
}
size = patchSize + stringSize;
memset(patchBuffer + size, 0, PATCH_BUFFER_SIZE - size);
/* Save file */
if (saveFile(outputFileName, patchExe, patchExeSize) < 0)
{
free(patchExe);
return -1;
}
free(patchExe);
printf("Patch saved!\n");
return 0;
}
static int
loadPatch()
{
char *p;
Patch *patch;
int i;
p = m_patchBuffer + SIZEOF_PATCH_BUFFER_MAGIC;
patch = (Patch *)p;
if (patch->name == NULL)
{
return -1;
}
m_patch.name = p + (int)patch->name;
m_patch.fileCount = patch->fileCount;
m_patch.files = (PatchedFile *)(p + (int)patch->files);
for (i = 0; i < m_patch.fileCount; i++)
{
m_patch.files[i].name = p + (int)m_patch.files[i].name;
m_patch.files[i].patches = (PatchedByte *)(p + (int)m_patch.files[i].patches);
}
printf("Patch %s loaded...\n", m_patch.name);
return 0;
}
/** MAIN FUNCTIONS ************************************************************/
static int
createPatch()
{
int i, status;
const char *outputFileName;
/* Check argument count */
if (m_argc < 6 || (m_argc % 2) != 0)
{
printUsage();
return -1;
}
outputFileName = m_argv[3];
m_patch.name = m_argv[2];
/* Allocate PatchedFiles array */
m_patch.fileCount = (m_argc - 4) / 2;
m_patch.files = malloc(m_patch.fileCount * sizeof (PatchedFile));
if (m_patch.files == NULL)
{
printf("Out of memory!\n");
return -1;
}
memset(m_patch.files, 0, m_patch.fileCount * sizeof (PatchedFile));
/* Compare original to patched files and fill m_patch.files array */
for (i = 0; i < m_patch.fileCount; i++)
{
m_patch.files[i].name = m_argv[4 + (i * 2) + 1];
status = compareFiles(m_patch.files + i, m_argv[4 + (i * 2) + 0]);
if (status < 0)
{
for (i = 0; i < m_patch.fileCount; i++)
{
if (m_patch.files[i].patches != NULL)
free(m_patch.files[i].patches);
}
free(m_patch.files);
m_patch.files = NULL;
m_patch.fileCount = 0;
return status;
}
}
/* Output patch */
return outputPatch(outputFileName);
}
static int
applyPatch()
{
int c, i, j, fileSize, makeBackup;
unsigned char *file;
char *p;
const char *fileName;
char buffer[MAX_PATH];
if (m_argc > 1 && strcmp(m_argv[1], "-d") != 0)
{
printUsage();
return -1;
}
/* Load patch */
if (loadPatch() < 0)
{
printf("This executable doesn't contain a patch, use -c to create one.\n");
return -1;
}
if (m_argc > 1)
{
/* Dump patch */
printf("Patch name: %s\n", m_patch.name);
printf("File count: %d\n", m_patch.fileCount);
for (i = 0; i < m_patch.fileCount; i++)
{
printf("----------------------\n"
"File name: %s\n"
"File size: %d bytes\n",
m_patch.files[i].name, m_patch.files[i].fileSize);
printf("Patch count: %d\n", m_patch.files[i].patchCount);
for (j = 0; j < m_patch.files[i].patchCount; j++)
{
printf(" Offset 0x%x 0x%02x -> 0x%02x\n",
m_patch.files[i].patches[j].offset,
m_patch.files[i].patches[j].expected,
m_patch.files[i].patches[j].patched);
}
}
}
else
{
/* Apply patch */
printf("Applying patch...\n");
for (i = 0; i < m_patch.fileCount; i++)
{
/* Load original file */
fileName = m_patch.files[i].name;
applyPatch_retry_file:
file = loadFile(fileName, &fileSize);
if (file == NULL)
{
printf("File %s not found! ", fileName);
applyPatch_file_open_error:
printf("(S)kip, (R)etry, (A)bort, (M)anually enter filename");
do
{
c = getch();
}
while (c != 's' && c != 'r' && c != 'a' && c != 'm');
printf("\n");
if (c == 's')
{
continue;
}
else if (c == 'r')
{
goto applyPatch_retry_file;
}
else if (c == 'a')
{
return 0;
}
else if (c == 'm')
{
if (fgets(buffer, sizeof (buffer), stdin) == NULL)
{
printf("fgets() failed!\n");
return -1;
}
p = strchr(buffer, '\r');
if (p != NULL)
*p = '\0';
p = strchr(buffer, '\n');
if (p != NULL)
*p = '\0';
fileName = buffer;
goto applyPatch_retry_file;
}
}
/* Check file size */
if (fileSize != m_patch.files[i].fileSize)
{
free(file);
printf("File %s has unexpected filesize of %d bytes (%d bytes expected)\n",
fileName, fileSize, m_patch.files[i].fileSize);
if (fileName != m_patch.files[i].name) /* manually entered filename */
{
goto applyPatch_file_open_error;
}
return -1;
}
/* Ask for backup */
printf("Do you want to make a backup of %s? (Y)es, (N)o, (A)bort", fileName);
do
{
c = getch();
}
while (c != 'y' && c != 'n' && c != 'a');
printf("\n");
if (c == 'y')
{
char buffer[MAX_PATH];
snprintf(buffer, MAX_PATH, "%s.bak", fileName);
buffer[MAX_PATH-1] = '\0';
makeBackup = 1;
if (access(buffer, 0) >= 0) /* file exists */
{
printf("File %s already exists, overwrite? (Y)es, (N)o, (A)bort", buffer);
do
{
c = getch();
}
while (c != 'y' && c != 'n' && c != 'a');
printf("\n");
if (c == 'n')
makeBackup = 0;
else if (c == 'a')
{
free(file);
return 0;
}
}
if (makeBackup && saveFile(buffer, file, fileSize) < 0)
{
free(file);
return -1;
}
}
else if (c == 'a')
{
free(file);
return 0;
}
/* Patch file */
for (j = 0; j < m_patch.files[i].patchCount; j++)
{
int offset = m_patch.files[i].patches[j].offset;
if (file[offset] != m_patch.files[i].patches[j].expected)
{
printf("Unexpected value in file %s at offset 0x%x: expected = 0x%02x, found = 0x%02x\n",
fileName, offset, m_patch.files[i].patches[j].expected, file[offset]);
free(file);
return -1;
}
file[offset] = m_patch.files[i].patches[j].patched;
}
/* Save file */
if (saveFile(fileName, file, fileSize) < 0)
{
free(file);
return -1;
}
free(file);
}
printf("Patch applied sucessfully!\n");
}
return 0;
}
static void
printUsage()
{
printf("Usage:\n"
"%s -c - Create patch\n"
"%s -d - Dump patch\n"
"%s - Apply patch\n"
"\n"
"A patch can be created like this:\n"
"%s -c \"patch name\" output.exe file1.orig file1.patched[ file2.orig file2.patched[ ...]]\n",
m_argv[0], m_argv[0], m_argv[0], m_argv[0]);
}
int
main(
int argc,
char *argv[])
{
m_argc = argc;
m_argv = argv;
if (argc >= 2 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0))
{
printUsage();
return 0;
}
else if (argc >= 2 && argv[1][0] == '-')
{
if (strcmp(argv[1], "-c") == 0)
{
return createPatch();
}
else if (strcmp(argv[1], "-d") == 0)
{
return applyPatch();
}
else
{
printf("Unknown option: %s\n"
"Use -h for help.\n",
argv[1]);
return -1;
}
}
return applyPatch();
}
-26
View File
@@ -1,26 +0,0 @@
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
FILE* in;
char ch;
for (i=1; i<argc; i++)
{
in = fopen(argv[i],"r");
if (in == NULL)
{
printf("Failed to open file %s\n", argv[i]);
return(0);
}
while ((ch = fgetc(in)) != EOF)
{
putchar(ch);
}
fclose(in);
}
return 0;
}
-17
View File
@@ -1,17 +0,0 @@
<group>
<directory name="net">
<xi:include href="net/directory.xml" />
</directory>
<directory name="getfirefox">
<xi:include href="getfirefox/getfirefox.xml" />
</directory>
<directory name="shutdown">
<xi:include href="shutdown/shutdown.xml" />
</directory>
<directory name="ps">
<xi:include href="ps/ps.xml" />
</directory>
<directory name="rosperf">
<xi:include href="rosperf/rosperf.xml" />
</directory>
</group>
-32
View File
@@ -1,32 +0,0 @@
/*
* Load a device driver
*/
#include <windows.h>
#include <ntos/zw.h>
int
main(int argc, char *argv[])
{
NTSTATUS Status;
UNICODE_STRING ServiceName;
if (argc != 2)
{
printf("Usage: load <ServiceName>\n");
return 0;
}
ServiceName.Length = (strlen(argv[1]) + 52) * sizeof(WCHAR);
ServiceName.Buffer = (LPWSTR)malloc(ServiceName.Length + sizeof(UNICODE_NULL));
wsprintf(ServiceName.Buffer,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%S",
argv[1]);
wprintf(L"%s %d %d\n", ServiceName.Buffer, ServiceName.Length, wcslen(ServiceName.Buffer));
Status = NtLoadDriver(&ServiceName);
free(ServiceName.Buffer);
if (!NT_SUCCESS(Status))
{
printf("Failed: %X\n", Status);
return 1;
}
return 0;
}
-32
View File
@@ -1,32 +0,0 @@
/*
* Unload a device driver
*/
#include <windows.h>
#include <ntos/zw.h>
int
main(int argc, char *argv[])
{
NTSTATUS Status;
UNICODE_STRING ServiceName;
if (argc != 2)
{
printf("Usage: unload <ServiceName>\n");
return 0;
}
ServiceName.Length = (strlen(argv[1]) + 52) * sizeof(WCHAR);
ServiceName.Buffer = (LPWSTR)malloc(ServiceName.Length + sizeof(UNICODE_NULL));
wsprintf(ServiceName.Buffer,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\%S",
argv[1]);
wprintf(L"%s %d %d\n", ServiceName.Buffer, ServiceName.Length, wcslen(ServiceName.Buffer));
Status = NtUnloadDriver(&ServiceName);
free(ServiceName.Buffer);
if (!NT_SUCCESS(Status))
{
printf("Failed: %X\n", Status);
return 1;
}
return 0;
}
-733
View File
@@ -1,733 +0,0 @@
/*
*
* dumprecbin - dumps a recycle bin database
*
* Copyright (c) 2005 by Thomas Weidenmueller <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* TODO: - Support for Vista recycle bins (read the DeleteInfo NTFS streams, also NT 5.x)
* - Support for INFO databases (win95)
*/
#include <windows.h>
#include <winternl.h>
#include <sddl.h>
#include <ntsecapi.h>
#include <stdio.h>
#include <ctype.h>
#include <tchar.h>
#ifndef NT_SUCCESS
#define NT_SUCCESS(status) ((LONG)(status) >= 0)
#endif
typedef struct _RECYCLE_BIN
{
struct _RECYCLE_BIN *Next;
PSID Sid;
WCHAR User[255];
WCHAR Path[MAX_PATH + 1];
} RECYCLE_BIN, *PRECYCLE_BIN;
typedef enum
{
ivUnknown = 0,
ivINFO2
} INFO_VERSION, *PINFO_VERSION;
typedef struct _INFO2_HEADER
{
DWORD Version;
DWORD Zero1;
DWORD Zero2;
DWORD RecordSize;
} INFO2_HEADER, *PINFO2_HEADER;
typedef struct _INFO2_RECORD
{
DWORD Unknown;
CHAR AnsiFileName[MAX_PATH];
DWORD RecordNumber;
DWORD DriveLetter;
FILETIME DeletionTime;
DWORD DeletedPhysicalSize;
WCHAR FileName[MAX_PATH - 2];
} INFO2_RECORD, *PINFO2_RECORD;
static HANDLE
OpenAndMapInfoDatabase(IN LPTSTR szFileName,
OUT PVOID *MappingBasePtr,
OUT PLARGE_INTEGER FileSize)
{
HANDLE hFile, hMapping = INVALID_HANDLE_VALUE;
hFile = CreateFile(szFileName,
FILE_READ_DATA,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM,
NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
if (GetFileSizeEx(hFile,
FileSize) &&
FileSize->QuadPart >= 0xF)
{
hMapping = CreateFileMapping(hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
if (hMapping == NULL ||
!(*MappingBasePtr = MapViewOfFile(hMapping,
FILE_MAP_READ,
0,
0,
0)))
{
if (hMapping != NULL)
{
CloseHandle(hMapping);
}
hMapping = INVALID_HANDLE_VALUE;
}
}
CloseHandle(hFile);
}
return hMapping;
}
static VOID
UnmapAndCloseDatabase(IN HANDLE hMapping,
IN PVOID MappingBasePtr)
{
UnmapViewOfFile(MappingBasePtr);
CloseHandle(hMapping);
}
static INFO_VERSION
DetectDatabaseVersion(PVOID Header)
{
PINFO2_HEADER Info2 = (PINFO2_HEADER)Header;
INFO_VERSION Version = ivUnknown;
if (Info2->Version == 5 &&
Info2->Zero1 == 0 &&
Info2->Zero2 == 0 &&
Info2->RecordSize == 0x320)
{
Version = ivINFO2;
}
return Version;
}
static BOOL
IsValidRecycleBin(IN LPTSTR szPath)
{
TCHAR szFile[MAX_PATH + 1];
TCHAR szClsId[48];
INFO_VERSION DbVersion = ivUnknown;
_stprintf(szFile,
_T("%s\\desktop.ini"),
szPath);
/* check if directory contains a valid desktop.ini for the recycle bin */
if (GetPrivateProfileString(TEXT(".ShellClassInfo"),
TEXT("CLSID"),
NULL,
szClsId,
sizeof(szClsId) / sizeof(szClsId[0]),
szFile) &&
!_tcsicmp(_T("{645FF040-5081-101B-9F08-00AA002F954E}"),
szClsId))
{
HANDLE hDb;
LARGE_INTEGER FileSize;
PVOID pDbBase = NULL;
/* open the database and check the signature */
_stprintf(szFile,
_T("%s\\INFO2"),
szPath);
hDb = OpenAndMapInfoDatabase(szFile,
&pDbBase,
&FileSize);
if (hDb != INVALID_HANDLE_VALUE)
{
DbVersion = DetectDatabaseVersion(pDbBase);
UnmapAndCloseDatabase(hDb,
pDbBase);
}
}
return DbVersion != ivUnknown;
}
static BOOL
OpenLocalLSAPolicyHandle(IN ACCESS_MASK DesiredAccess,
OUT PLSA_HANDLE PolicyHandle)
{
LSA_OBJECT_ATTRIBUTES LsaObjectAttributes = {0};
NTSTATUS Status;
Status = LsaOpenPolicy(NULL,
&LsaObjectAttributes,
DesiredAccess,
PolicyHandle);
if (!NT_SUCCESS(Status))
{
SetLastError(LsaNtStatusToWinError(Status));
return FALSE;
}
return TRUE;
}
static BOOL
ConvertSIDToAccountName(IN PSID Sid,
OUT LPWSTR User)
{
DWORD AccountNameLen = 0;
DWORD DomainNameLen = 0;
SID_NAME_USE NameUse;
DWORD Error = ERROR_SUCCESS;
LPWSTR AccountName, DomainName;
BOOL Ret = FALSE;
if (!LookupAccountSidW(NULL,
Sid,
NULL,
&AccountNameLen,
NULL,
&DomainNameLen,
&NameUse))
{
Error = GetLastError();
if (Error == ERROR_NONE_MAPPED ||
Error != ERROR_INSUFFICIENT_BUFFER)
{
/* some unexpected error occured! */
goto ConvertSID;
}
}
AccountName = (LPWSTR)HeapAlloc(GetProcessHeap(),
0,
(AccountNameLen + DomainNameLen) * sizeof(WCHAR));
if (AccountName != NULL)
{
LSA_HANDLE PolicyHandle;
DomainName = AccountName + AccountNameLen;
if (!LookupAccountSidW(NULL,
Sid,
AccountName,
&AccountNameLen,
DomainName,
&DomainNameLen,
&NameUse))
{
goto BailFreeAccountName;
}
wcscpy(User,
AccountName);
Ret = TRUE;
if (OpenLocalLSAPolicyHandle(POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION,
&PolicyHandle))
{
PLSA_REFERENCED_DOMAIN_LIST ReferencedDomain;
PLSA_TRANSLATED_NAME Names;
PLSA_TRUST_INFORMATION Domain;
PLSA_UNICODE_STRING DomainName;
PPOLICY_ACCOUNT_DOMAIN_INFO PolicyAccountDomainInfo = NULL;
NTSTATUS Status;
Status = LsaLookupSids(PolicyHandle,
1,
&Sid,
&ReferencedDomain,
&Names);
if (NT_SUCCESS(Status))
{
if (ReferencedDomain != NULL &&
Names->DomainIndex >= 0)
{
Domain = &ReferencedDomain->Domains[Names->DomainIndex];
DomainName = &Domain->Name;
}
else
{
Domain = NULL;
DomainName = NULL;
}
switch (Names->Use)
{
case SidTypeAlias:
if (Domain != NULL)
{
/* query the domain name for BUILTIN accounts */
Status = LsaQueryInformationPolicy(PolicyHandle,
PolicyAccountDomainInformation,
(PVOID*)&PolicyAccountDomainInfo);
if (NT_SUCCESS(Status))
{
DomainName = &PolicyAccountDomainInfo->DomainName;
}
}
/* fall through */
case SidTypeUser:
{
if (Domain != NULL)
{
WCHAR *s;
/* NOTE: LSA_UNICODE_STRINGs are not always NULL-terminated! */
wcscpy(User,
AccountName);
wcscat(User,
L" (");
s = User + wcslen(User);
CopyMemory(s,
DomainName->Buffer,
DomainName->Length);
s += DomainName->Length / sizeof(WCHAR);
*(s++) = L'\\';
CopyMemory(s,
Names->Name.Buffer,
Names->Name.Length);
s += Names->Name.Length / sizeof(WCHAR);
*(s++) = L')';
*s = L'\0';
}
break;
}
case SidTypeWellKnownGroup:
{
break;
}
default:
{
_ftprintf(stderr,
_T("Unhandled SID type: 0x%x\n"),
Names->Use);
break;
}
}
if (PolicyAccountDomainInfo != NULL)
{
LsaFreeMemory(PolicyAccountDomainInfo);
}
LsaFreeMemory(ReferencedDomain);
LsaFreeMemory(Names);
}
LsaClose(PolicyHandle);
if (!NT_SUCCESS(Status))
{
Ret = FALSE;
goto BailFreeAccountName;
}
}
else
{
BailFreeAccountName:
HeapFree(GetProcessHeap(),
0,
AccountName);
goto ConvertSID;
}
}
ConvertSID:
if (!Ret)
{
LPWSTR StrSid;
Ret = ConvertSidToStringSidW(Sid,
&StrSid);
if (Ret)
{
wcscpy(User,
StrSid);
LocalFree((HLOCAL)StrSid);
}
}
return Ret;
}
static VOID
FreeRecycleBinsList(IN OUT PRECYCLE_BIN *RecycleBinsListHead)
{
PRECYCLE_BIN CurrentBin, NextBin;
CurrentBin = *RecycleBinsListHead;
while (CurrentBin != NULL)
{
NextBin = CurrentBin->Next;
LocalFree((HLOCAL)CurrentBin->Sid);
HeapFree(GetProcessHeap(),
0,
CurrentBin);
CurrentBin = NextBin;
}
*RecycleBinsListHead = NULL;
}
static BOOL
LocateRecycleBins(IN LPWSTR szDrive,
OUT PRECYCLE_BIN *RecycleBinsListHead)
{
TCHAR szRecBinPath[MAX_PATH + 1];
HANDLE FindResult;
WIN32_FIND_DATA FindData;
PRECYCLE_BIN NewBin;
BOOL Ret = FALSE;
FreeRecycleBinsList(RecycleBinsListHead);
/*
* search for recycle bins on volumes that support file security (NTFS)
*/
_stprintf(szRecBinPath,
_T("%lS\\RECYCLER\\*"),
szDrive);
FindResult = FindFirstFile(szRecBinPath,
&FindData);
if (FindResult != INVALID_HANDLE_VALUE)
{
do
{
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
_tcscmp(FindData.cFileName,
_T("..")) &&
_tcscmp(FindData.cFileName,
_T(".")))
{
PSID Sid;
if (ConvertStringSidToSid(FindData.cFileName,
&Sid))
{
_stprintf(szRecBinPath,
_T("%s\\RECYCLER\\%s"),
szDrive,
FindData.cFileName);
if (IsValidRecycleBin(szRecBinPath))
{
NewBin = (PRECYCLE_BIN)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(RECYCLE_BIN));
if (NewBin != NULL)
{
_tcscpy(NewBin->Path,
szRecBinPath);
/* convert the SID to an account name */
ConvertSIDToAccountName(Sid,
NewBin->User);
/* append the recycle bin */
*RecycleBinsListHead = NewBin;
RecycleBinsListHead = &NewBin->Next;
Ret = TRUE;
}
else
goto ContinueFreeSid;
}
else
{
ContinueFreeSid:
LocalFree((HLOCAL)Sid);
}
}
}
} while (FindNextFile(FindResult,
&FindData));
FindClose(FindResult);
}
/*
* search for recycle bins on volumes that don't support file security (FAT)
*/
_stprintf(szRecBinPath,
_T("%s\\Recycled"),
szDrive);
FindResult = FindFirstFile(szRecBinPath,
&FindData);
if (FindResult != INVALID_HANDLE_VALUE)
{
if (IsValidRecycleBin(szRecBinPath))
{
SID_IDENTIFIER_AUTHORITY WorldSia = {SECURITY_WORLD_SID_AUTHORITY};
PSID EveryoneSid;
/* create an Everyone SID */
if (AllocateAndInitializeSid(&WorldSia,
1,
SECURITY_WORLD_RID,
0,
0,
0,
0,
0,
0,
0,
&EveryoneSid))
{
NewBin = (PRECYCLE_BIN)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(RECYCLE_BIN));
if (NewBin != NULL)
{
_tcscpy(NewBin->Path,
szRecBinPath);
/* convert the SID to an account name */
ConvertSIDToAccountName(EveryoneSid,
NewBin->User);
/* append the recycle bin */
*RecycleBinsListHead = NewBin;
RecycleBinsListHead = &NewBin->Next;
Ret = TRUE;
}
else
FreeSid(EveryoneSid);
}
}
FindClose(FindResult);
}
return Ret;
}
static VOID
DiskFileNameFromRecord(OUT LPTSTR szShortFileName,
IN DWORD RecordNumber,
IN WCHAR cDriveLetter,
IN LPWSTR szFileName)
{
LPWSTR FileExt;
FileExt = wcsrchr(szFileName,
L'.');
if (FileExt != NULL)
{
_stprintf(szShortFileName,
_T("D%lC%d%lS"),
cDriveLetter,
RecordNumber,
FileExt);
}
else
{
_stprintf(szShortFileName,
_T("D%lC%d"),
cDriveLetter,
RecordNumber);
}
}
static BOOL
DumpRecycleBin(IN PRECYCLE_BIN RecycleBin)
{
WCHAR szFile[MAX_PATH + 1];
HANDLE hDb;
LARGE_INTEGER FileSize;
PVOID pDbBase = NULL;
INFO_VERSION Version = ivUnknown;
_tprintf(_T("Dumping recycle bin of \"%lS\":\n"),
RecycleBin->User);
_tprintf(_T("Directory: %lS\n\n"),
RecycleBin->Path);
_stprintf(szFile,
_T("%s\\INFO2"),
RecycleBin->Path);
hDb = OpenAndMapInfoDatabase(szFile,
&pDbBase,
&FileSize);
if (hDb != INVALID_HANDLE_VALUE)
{
Version = DetectDatabaseVersion(pDbBase);
/* dump the INFO2 database */
switch (Version)
{
case ivINFO2:
{
DWORD nRecords;
PINFO2_HEADER Info2Header = (PINFO2_HEADER)pDbBase;
PINFO2_RECORD Info2 = (PINFO2_RECORD)(Info2Header + 1);
int i = 0;
nRecords = (FileSize.QuadPart - sizeof(INFO2_HEADER)) / Info2Header->RecordSize;
while (nRecords != 0)
{
/* if the first character of the AnsiFileName is zero, the record
is considered deleted */
if (Info2->AnsiFileName[0] != '\0')
{
_tprintf(_T(" [%d] Record: #%d \"%lS\"\n"),
++i,
Info2->RecordNumber,
Info2->FileName);
DiskFileNameFromRecord(szFile,
Info2->RecordNumber,
(WCHAR)Info2->DriveLetter + L'a',
Info2->FileName);
_tprintf(_T(" Name on disk: \"%s\"\n"),
szFile);
_tprintf(_T(" Deleted size on disk: %d KB\n"),
Info2->DeletedPhysicalSize / 1024);
}
nRecords--;
Info2++;
}
break;
}
default:
break;
}
UnmapAndCloseDatabase(hDb,
pDbBase);
}
return FALSE;
}
static BOOL
SelectRecycleBin(IN LPWSTR szDrive)
{
BOOL Ret;
PRECYCLE_BIN RecycleBinsList = NULL;
Ret = LocateRecycleBins(szDrive,
&RecycleBinsList);
if (Ret)
{
if (RecycleBinsList->Next != NULL)
{
PRECYCLE_BIN CurrentBin = RecycleBinsList;
int n = 0, i = 0;
/* if there are multiple recycle bins ask the user which one to dump */
_tprintf(_T("There are several recycle bins on this drive. Select one:\n"));
while (CurrentBin != NULL)
{
_tprintf(_T(" [%d] %lS\n"),
++i,
CurrentBin->User);
CurrentBin = CurrentBin->Next;
n++;
}
_tprintf(_T("Enter the number: "));
DisplayPrompt:
_tscanf(_T("%d"),
&i);
if (i > n || i < 1)
{
_tprintf(_T("Please enter a number between 1 and %d: "),
n);
goto DisplayPrompt;
}
/* walk to the selected recycle bin */
CurrentBin = RecycleBinsList;
while (CurrentBin != NULL && i != 1)
{
CurrentBin = CurrentBin->Next;
i--;
}
/* dump it */
Ret = DumpRecycleBin(CurrentBin);
}
else
{
/* dump the first (and only) recycle bin */
Ret = DumpRecycleBin(RecycleBinsList);
}
}
else
{
_ftprintf(stderr,
_T("No recycle bins on this volume!\n"));
}
FreeRecycleBinsList(&RecycleBinsList);
return Ret;
}
static VOID
PrintHelp(VOID)
{
_ftprintf(stderr,
_T("Usage: dumprecbin C:\n"));
}
int
main(int argc,
char *argv[])
{
if (argc != 2 ||
strlen(argv[1]) != 2 || argv[1][1] != ':' ||
toupper(argv[1][0]) < 'A' || toupper(argv[1][0]) > 'Z')
{
PrintHelp();
return 1;
}
else
{
WCHAR szDrive[3];
_stprintf(szDrive,
_T("%lC:"),
argv[1][0]);
if (!SelectRecycleBin(szDrive))
return 1;
else
return 0;
}
}
@@ -1,13 +0,0 @@
<module name="dumprecbin" type="win32cui" installbase="bin" installname="dumprecbin.exe">
<include base="dumprecbin">.</include>
<define name="__USE_W32API" />
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="_WIN32_IE">0x0500</define>
<define name="_WIN32_WINNT">0x0600</define>
<define name="WINVER">0x0600</define>
<library>advapi32</library>
<library>kernel32</library>
<library>ntdll</library>
<file>dumprecbin.c</file>
</module>
-84
View File
@@ -1,84 +0,0 @@
/*
* ReactOS INF Helper
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* PROJECT: INF Helper
* FILE: infinst.c
* PURPOSE: Pass INF files to setupapi.dll for execution
* PROGRAMMER: Michael Biggins
* UPDATE HISTORY:
* Created 19/09/2004
*/
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#ifdef UNICODE
VOID WINAPI InstallHinfSectionW(HWND hwnd, HINSTANCE handle, LPCWSTR cmdline, INT show);
#define InstallHinfSection InstallHinfSectionW
#else
VOID WINAPI InstallHinfSectionA(HWND hwnd, HINSTANCE handle, LPCSTR cmdline, INT show);
#define InstallHinfSection InstallHinfSectionA
#endif
#define FILEOPEN_FILTER TEXT("Inf Files (*.inf)\0*.inf\0All Files (*.*)\0*.*\0\0")
#define FILEOPEN_TITLE TEXT("INF file to process")
#define FILEOPEN_DEFEXT TEXT(".inf")
#define INF_COMMAND TEXT("DefaultInstall 128 %s")
int
_tmain(int argc, TCHAR *argv[])
{
TCHAR infCommand[MAX_PATH + 32];
if (argc <= 1)
{
TCHAR FileName[MAX_PATH + 1];
OPENFILENAME ofc;
int rv;
ZeroMemory(&ofc, sizeof(ofc));
ZeroMemory(FileName, MAX_PATH + 1);
ofc.lStructSize = sizeof(ofc);
ofc.lpstrFilter = FILEOPEN_FILTER;
ofc.nFilterIndex = 1;
ofc.lpstrTitle = FILEOPEN_TITLE;
ofc.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_PATHMUSTEXIST;
ofc.lpstrDefExt = FILEOPEN_DEFEXT;
ofc.lpstrFile = FileName;
ofc.nMaxFile = sizeof(FileName) / sizeof(TCHAR);
rv = GetOpenFileName(&ofc);
if (rv == 0)
return 1;
_stprintf(infCommand, INF_COMMAND, FileName);
}
else
{
if (_tcslen(argv[1]) > MAX_PATH)
{
MessageBox(NULL, TEXT("Command line too long to be a valid file name"), NULL, MB_OK | MB_ICONERROR);
return 2; /* User error */
}
_stprintf(infCommand, INF_COMMAND, argv[1]);
}
InstallHinfSection(NULL, NULL, infCommand, 0);
return 0;
}
@@ -1,55 +0,0 @@
/* $Id$
*
* Convert NTSTATUS codes to Win32 error codes: run it
* on a NT box AND on a ROS box, then diff the results.
*
* This utility should help keeping correct how Ros
* translates executive's errors codes into Win32 error
* codes.
*
* Usage: nts2w32err [MaxStatusCode] > log.txt
*
* 2004-01-10 Emanuele Aliberti
*
*/
#include <windows.h>
#include <ntddk.h>
#include <stdio.h>
int main (int argc, char * argv [])
{
NTSTATUS Severity = 0;
NTSTATUS StatusCode = STATUS_SUCCESS;
NTSTATUS Status = STATUS_SUCCESS;
DWORD LastError = ERROR_SUCCESS;
DWORD Maximum = 0x40000;
if (2 == argc)
{
sscanf (argv[1], "%lx", & Maximum);
}
printf ("NT error codes 0x0-0x%lx that get translated *not* to ERROR_MR_MID_NOT_FOUND (317)\n\n", Maximum);
for ( Severity = 0;
Severity < 4;
Severity ++)
{
printf ("--- Severity %ld ---\n", Severity);
for ( StatusCode = STATUS_SUCCESS;
StatusCode <= Maximum ;
StatusCode ++)
{
Status = ((Severity << 30) | StatusCode);
LastError = RtlNtStatusToDosError (Status);
if (ERROR_MR_MID_NOT_FOUND != LastError)
{
printf ("0x%08lx => %ldL\n", Status, LastError);
}
}
}
return EXIT_SUCCESS;
}
/* EOF */
-380
View File
@@ -1,380 +0,0 @@
/* $Id$
*
* DESCRIPTION: Object Manager Simple Explorer
* PROGRAMMER: David Welch
* REVISIONS
* 2000-04-30 (ea)
* Added directory enumeration.
* (tested under nt4sp4/x86)
* 2000-08-11 (ea)
* Added symbolic link expansion.
* (tested under nt4sp4/x86)
* 2001-05-01 (ea)
* Fixed entries counter. Added more
* error codes check. Removed wprintf,
* because it does not work in .17.
* 2001-05-02 (ea)
* Added -r option.
*/
#include <ntddk.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_DIR_ENTRY 256
static
PCHAR
STDCALL
RawUszAsz (
PWCHAR szU,
PCHAR szA
)
{
register PCHAR a = szA;
while (*szU) {*szA++ = (CHAR) (0x00ff & * szU++);}
*szA = '\0';
return a;
}
static
PWCHAR
STDCALL
RawAszUsz (
PCHAR szA,
PWCHAR szW
)
{
register PWCHAR w = szW;
while (*szA) {*szW++ = (WCHAR) *szA++;}
*szW = L'\0';
return w;
}
static
const char *
STDCALL
StatusToName (NTSTATUS Status)
{
static char RawValue [16];
switch (Status)
{
case STATUS_BUFFER_TOO_SMALL:
return "STATUS_BUFFER_TOO_SMALL";
case STATUS_INVALID_PARAMETER:
return "STATUS_INVALID_PARAMETER";
case STATUS_OBJECT_NAME_INVALID:
return "STATUS_OBJECT_NAME_INVALID";
case STATUS_OBJECT_NAME_NOT_FOUND:
return "STATUS_OBJECT_NAME_NOT_FOUND";
case STATUS_OBJECT_PATH_SYNTAX_BAD:
return "STATUS_PATH_SYNTAX_BAD";
case STATUS_NO_MORE_ENTRIES:
return "STATUS_NO_MORE_ENTRIES";
case STATUS_MORE_ENTRIES:
return "STATUS_MORE_ENTRIES";
case STATUS_ACCESS_DENIED:
return "STATUS_ACCESS_DENIED";
case STATUS_UNSUCCESSFUL:
return "STATUS_UNSUCCESSFUL";
case STATUS_INVALID_HANDLE:
return "STATUS_INVALID_HANDLE";
}
sprintf (RawValue, "0x%08lx", Status);
return (const char *) RawValue;
}
BOOL
STDCALL
ExpandSymbolicLink (
IN PUNICODE_STRING DirectoryName,
IN PUNICODE_STRING SymbolicLinkName,
IN OUT PUNICODE_STRING TargetObjectName
)
{
NTSTATUS Status;
HANDLE hSymbolicLink;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING Path;
WCHAR PathBuffer [MAX_PATH];
ULONG DataWritten = 0;
Path.Buffer = PathBuffer;
Path.Length = 0;
Path.MaximumLength = sizeof PathBuffer;
RtlCopyUnicodeString (& Path, DirectoryName);
if (L'\\' != Path.Buffer [(Path.Length / sizeof Path.Buffer[0]) - 1])
{
RtlAppendUnicodeToString (& Path, L"\\");
}
RtlAppendUnicodeStringToString (& Path, SymbolicLinkName);
oa.Length = sizeof (OBJECT_ATTRIBUTES);
oa.ObjectName = & Path;
oa.Attributes = 0; /* OBJ_CASE_INSENSITIVE; */
oa.RootDirectory = NULL;
oa.SecurityDescriptor = NULL;
oa.SecurityQualityOfService = NULL;
Status = NtOpenSymbolicLinkObject(
& hSymbolicLink,
SYMBOLIC_LINK_QUERY, /* 0x20001 */
& oa
);
if (!NT_SUCCESS(Status))
{
printf (
"Failed to open SymbolicLink object (Status: %s)\n",
StatusToName (Status)
);
return FALSE;
}
TargetObjectName->Length = TargetObjectName->MaximumLength;
memset (
TargetObjectName->Buffer,
0,
TargetObjectName->MaximumLength
);
Status = NtQuerySymbolicLinkObject(
hSymbolicLink,
TargetObjectName,
& DataWritten
);
if (!NT_SUCCESS(Status))
{
printf (
"Failed to query SymbolicLink object (Status: %s)\n",
StatusToName (Status)
);
NtClose (hSymbolicLink);
return FALSE;
}
NtClose (hSymbolicLink);
return TRUE;
}
BOOL
STDCALL
ListDirectory (
IN PUNICODE_STRING DirectoryNameW,
IN BOOL Recurse
)
{
CHAR DirectoryNameA [MAX_PATH];
OBJECT_ATTRIBUTES ObjectAttributes;
NTSTATUS Status;
HANDLE DirectoryHandle;
BYTE DirectoryEntry [512];
POBJECT_DIRECTORY_INFORMATION pDirectoryEntry = (POBJECT_DIRECTORY_INFORMATION) DirectoryEntry;
POBJECT_DIRECTORY_INFORMATION pDirectoryEntries = (POBJECT_DIRECTORY_INFORMATION) DirectoryEntry;
ULONG Context = 0;
ULONG ReturnLength = 0;
ULONG EntryCount = 0;
/* For expanding symbolic links */
WCHAR TargetName [2 * MAX_PATH];
UNICODE_STRING TargetObjectName = {
sizeof TargetName,
sizeof TargetName,
TargetName
};
/* Convert to ANSI the directory's name */
RawUszAsz (DirectoryNameW->Buffer, DirectoryNameA);
/*
* Prepare parameters for next call.
*/
InitializeObjectAttributes (
& ObjectAttributes,
DirectoryNameW,
0,
NULL,
NULL
);
/*
* Try opening the directory.
*/
Status = NtOpenDirectoryObject (
& DirectoryHandle,
DIRECTORY_QUERY,
& ObjectAttributes
);
if (!NT_SUCCESS(Status))
{
printf (
"Failed to open directory object \"%s\" (Status: %s)\n",
DirectoryNameA,
StatusToName (Status)
);
return (FALSE);
}
printf ("\n Directory of %s\n\n", DirectoryNameA);
for(;;)
{
/*
* Enumerate each item in the directory.
*/
Status = NtQueryDirectoryObject (
DirectoryHandle,
pDirectoryEntries,
sizeof DirectoryEntry,
FALSE,/* ReturnSingleEntry */
FALSE, /* RestartScan */
& Context,
& ReturnLength
);
if (!NT_SUCCESS(Status) && Status != STATUS_NO_MORE_ENTRIES)
{
printf (
"Failed to query directory object (Status: %s)\n",
StatusToName (Status)
);
NtClose (DirectoryHandle);
return (FALSE);
}
if (Status == STATUS_NO_MORE_ENTRIES)
{
break;
}
pDirectoryEntry = pDirectoryEntries;
while (EntryCount < Context)
{
CHAR ObjectNameA [MAX_PATH];
CHAR TypeNameA [MAX_PATH];
CHAR TargetNameA [MAX_PATH];
if (0 == wcscmp (L"SymbolicLink", pDirectoryEntry->ObjectTypeName.Buffer))
{
if (TRUE == ExpandSymbolicLink (
DirectoryNameW,
& pDirectoryEntry->ObjectName,
& TargetObjectName
)
)
{
printf (
"%-16s %s -> %s\n",
RawUszAsz (pDirectoryEntry->ObjectTypeName.Buffer, TypeNameA),
RawUszAsz (pDirectoryEntry->ObjectName.Buffer, ObjectNameA),
RawUszAsz (TargetObjectName.Buffer, TargetNameA)
);
}
else
{
printf (
"%-16s %s -> (error!)\n",
RawUszAsz (pDirectoryEntry->ObjectTypeName.Buffer, TypeNameA),
RawUszAsz (pDirectoryEntry->ObjectName.Buffer, ObjectNameA)
);
}
}
else
{
printf (
"%-16s %s\n",
RawUszAsz (pDirectoryEntry->ObjectTypeName.Buffer, TypeNameA),
RawUszAsz (pDirectoryEntry->ObjectName.Buffer, ObjectNameA)
);
}
++ pDirectoryEntry;
++ EntryCount;
}
};
printf ("\n\t%lu object(s)\n", EntryCount);
/*
* Free any resource.
*/
NtClose (DirectoryHandle);
/*
* Recurse into, if required so.
*/
if (FALSE != Recurse)
{
pDirectoryEntry = (POBJECT_DIRECTORY_INFORMATION) DirectoryEntry;
while (0 != pDirectoryEntry->ObjectTypeName.Length)
{
if (0 == wcscmp (L"Directory", pDirectoryEntry->ObjectTypeName.Buffer))
{
WCHAR CurrentName [MAX_PATH];
UNICODE_STRING CurrentDirectory;
CurrentName [0] = L'\0';
wcscpy (CurrentName, DirectoryNameW->Buffer);
if (wcslen (CurrentName) > 1)
{
wcscat (CurrentName, L"\\");
}
wcscat (CurrentName, pDirectoryEntry->ObjectName.Buffer);
RtlInitUnicodeString (& CurrentDirectory, CurrentName);
ListDirectory (& CurrentDirectory, Recurse);
}
++ pDirectoryEntry;
}
}
return (TRUE);
}
int main(int argc, char* argv[])
{
WCHAR DirectoryNameW [MAX_PATH];
UNICODE_STRING DirectoryName;
BOOL Recurse = FALSE;
/*
* Check user arguments.
*/
switch (argc)
{
case 2:
RawAszUsz (argv[1], DirectoryNameW);
break;
case 3:
if (strcmp (argv[1], "-r"))
{
fprintf (
stderr,
"%s: unknown option '%s'.\n",
argv [0], argv[1]
);
return EXIT_FAILURE;
}
RawAszUsz (argv[2], DirectoryNameW);
Recurse = TRUE;
break;
default:
fprintf (
stderr,
"\nUsage: %s [-r] directory\n\n"
" -r recurse\n"
" directory a directory name in the system namespace\n\n",
argv [0]
);
return EXIT_FAILURE;
}
/*
* List the directory.
*/
RtlInitUnicodeString (& DirectoryName, DirectoryNameW);
return (FALSE == ListDirectory (& DirectoryName, Recurse))
? EXIT_FAILURE
: EXIT_SUCCESS;
}
/* EOF */
-214
View File
@@ -1,214 +0,0 @@
/*
* partinfo - partition info program
*/
#include <windows.h>
//#include <winioctl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ntddk.h>
//#define DUMP_DATA
#define DUMP_SIZE_INFO
#define UNICODE
#ifdef DUMP_DATA
void HexDump(char *buffer, ULONG size)
{
ULONG offset = 0;
unsigned char *ptr;
while (offset < (size & ~15))
{
ptr = (unsigned char*)((ULONG)buffer + offset);
printf("%08lx %02hx %02hx %02hx %02hx %02hx %02hx %02hx %02hx-%02hx %02hx %02hx %02hx %02hx %02hx %02hx %02hx\n",
offset,
ptr[0],
ptr[1],
ptr[2],
ptr[3],
ptr[4],
ptr[5],
ptr[6],
ptr[7],
ptr[8],
ptr[9],
ptr[10],
ptr[11],
ptr[12],
ptr[13],
ptr[14],
ptr[15]);
offset += 16;
}
ptr = (unsigned char*)((ULONG)buffer + offset);
printf("%08lx ", offset);
while (offset < size)
{
printf(" %02hx", *ptr);
offset++;
ptr++;
}
printf("\n\n\n");
}
#endif
void Usage(void)
{
puts("Usage: partinfo <drive number>");
}
int main (int argc, char *argv[])
{
HANDLE hDisk;
DWORD dwRead;
DWORD i;
char *Buffer;
DRIVE_LAYOUT_INFORMATION *LayoutBuffer;
DISK_GEOMETRY DiskGeometry;
ULONG ulDrive;
CHAR DriveName[40];
SYSTEM_DEVICE_INFORMATION DeviceInfo;
NTSTATUS Status;
if (argc != 2)
{
Usage();
return(0);
}
ulDrive = strtoul(argv[1], NULL, 10);
if (errno != 0)
{
printf("Error: Malformed drive number\n");
return(0);
}
/* Check drive number */
Status = NtQuerySystemInformation(SystemDeviceInformation,
&DeviceInfo,
sizeof(SYSTEM_DEVICE_INFORMATION),
&i);
if (!NT_SUCCESS(Status))
{
printf("NtQuerySystemInformation() failed (Status %lx)\n", Status);
return(0);
}
if (DeviceInfo.NumberOfDisks == 0)
{
printf("No disk drive installed!\n");
return(0);
}
if (ulDrive >= DeviceInfo.NumberOfDisks)
{
printf("Invalid disk drive number! Valid drive numbers [0-%lu]\n",
DeviceInfo.NumberOfDisks-1);
return(0);
}
/* Build full drive name */
sprintf(DriveName, "\\\\.\\PHYSICALDRIVE%lu", ulDrive);
/* Open drive */
hDisk = CreateFile(DriveName,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hDisk == INVALID_HANDLE_VALUE)
{
printf("Invalid disk handle!");
return 0;
}
/* Get drive geometry */
if (!DeviceIoControl(hDisk,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
&DiskGeometry,
sizeof(DISK_GEOMETRY),
&dwRead,
NULL))
{
CloseHandle(hDisk);
printf("DeviceIoControl failed! Error: %lu\n",
GetLastError());
return 0;
}
#ifdef DUMP_DATA
HexDump((char*)&DiskGeometry, dwRead);
#endif
printf("Drive number: %lu\n", ulDrive);
printf("Cylinders: %I64u\nMediaType: %x\nTracksPerCylinder: %lu\n"
"SectorsPerTrack: %lu\nBytesPerSector: %lu\n\n",
DiskGeometry.Cylinders.QuadPart,
DiskGeometry.MediaType,
DiskGeometry.TracksPerCylinder,
DiskGeometry.SectorsPerTrack,
DiskGeometry.BytesPerSector);
Buffer = (char*)malloc(8192);
if (Buffer == NULL)
{
CloseHandle(hDisk);
printf("Out of memory!");
return 0;
}
memset(Buffer, 0, 8192);
if (!DeviceIoControl(hDisk,
IOCTL_DISK_GET_DRIVE_LAYOUT,
NULL,
0,
Buffer,
8192,
&dwRead,
NULL))
{
CloseHandle(hDisk);
printf("DeviceIoControl(IOCTL_DISK_GET_DRIVE_LAYOUT) failed! Error: %lu\n",
GetLastError());
free(Buffer);
return 0;
}
CloseHandle(hDisk);
#ifdef DUMP_DATA
HexDump(Buffer, dwRead);
#endif
LayoutBuffer = (DRIVE_LAYOUT_INFORMATION*)Buffer;
printf("Partitions %lu Signature %lx\n",
LayoutBuffer->PartitionCount,
LayoutBuffer->Signature);
for (i = 0; i < LayoutBuffer->PartitionCount; i++)
{
printf(" %ld: nr: %ld boot: %1x type: %x start: 0x%I64x count: 0x%I64x\n",
i,
LayoutBuffer->PartitionEntry[i].PartitionNumber,
LayoutBuffer->PartitionEntry[i].BootIndicator,
LayoutBuffer->PartitionEntry[i].PartitionType,
LayoutBuffer->PartitionEntry[i].StartingOffset.QuadPart,
LayoutBuffer->PartitionEntry[i].PartitionLength.QuadPart);
}
free(Buffer);
return 0;
}
-132
View File
@@ -1,132 +0,0 @@
<!-- $Id$ -->
<HTML>
<HEAD>
<TITLE>Using NVidia drivers on ReactOS How-to</TITLE>
</HEAD>
<BODY>
<CENTER><H1>Using NVidia drivers on ReactOS How-to</H1></CENTER>
<H2>1. Introduction</H2>
There is little support for changing video drivers (or any other driver for that
matter) in ReactOS at the moment. You have to know how to access the CVS repository
and how to compile (simple) programs. If this is too complicated, please wait a few
months, we should have better installation tools then.
<H2>2. Supported hardware</H2>
The NVidia drivers were tested on the following video card:
<UL>
<LI>NVidia Riva TNT2 Model 64</LI>
<LI>NVidia GeForce4 MX400</LI>
</UL>
However, according to the NVidia website, the same driver supports a whole series
of video cards. If you find this driver works under ReactOS with other cards, please
let us know on the <A HREF="mailto:[email protected]">ros-general mailing list</A>
<H2>3. Download the drivers</H2>
First, go to the NVidia website, <A HREF="http://www.nvidia.com">www.nvidia.com</A>,
choose "DOWNLOAD&nbsp;DRIVERS" from the menu at the top of the page (and
"Download&nbsp;Drivers" again from the drop-down menu). Choose "Graphics&nbsp;Driver"
in the first box, "GeForce&nbsp;and&nbsp;TNT2" in the second box and "Windows&nbsp;NT4"
in the third box, then click "Go!". This How-to assumes you see a page identifying the
driver you are about to download as version 43.45, release on April&nbsp;10, 2003.
Download the English version.<BR>
(<A HREF="http://www.nvidia.com/object/winnt_43.45">This</A> is a direct link to the
download page.)
<H2>4. Unpack the drivers</H2>
Start the file you just downloaded (note: you need to do this on a MS-Windows computer,
doesn't work on ReactOS yet). It will ask you for a directory where to save the files.
You can accept the default of C:\NVIDIA\WinNT4\43.45 or change it to your liking, just
remember where you put them.... After the files are unpacked, the install wizard will
start. Just press "Cancel" on the Welcome screen and tell the thing that, yes, you
are quite sure you want to cancel the installation.<BR>
Open a Command Prompt window and cd to C:\NVIDIA\WinNT4\43.45 (or wherever you put
the files). You should have a nv4_mini.sy_ and a nv4_disp.dl_ file. Issue the following
commands:
<PRE>
expand nv4_mini.sy_ nv4_mini.sys
expand nv4_disp.dl_ nv4_disp.dll
</PRE>
After this, you should have a nv4_mini.sys file of 1511936 bytes and a nv4_disp.dll file
of 569807 bytes.
<H2>5. Patch the miniport driver</H2>
Since ReactOS is not 100% binary compatible with MS-Windows yet, the miniport driver
(nv4_mini.sys) needs to be patched. There is a small patch program in the ReactOS CVS
tree at reactos/apps/utils/patchnv4 which you need to compile. Copy the patchnv4.exe
to the directory where you have your nv4_mini.sys file and run it. Afterwards, you
should have a nv4_mini.sys.orig (the original) and a nv4_mini.sys (the patched
version).<BR>
Note that we're working towards binary compatibility, so if you're not reading this
on the <A HREF="http://www.reactos.com">ReactOS website</A>, please go there and check
if the patching is still necessary (ReactOS might have been fixed...).
<H2>6. Install the drivers</H2>
The first step is simple, copy the (patched) nv4_mini.sys file to \ReactOS\System32\drivers
and the nv4_disp.dll file to \ReactOS\System32. The second step is to update the
registry to actually load the driver. Check out the CVS tree and edit the file
reactos/bootdata/hivesys.inf. Add the following lines:
<PRE>
; NVidia driver
HKLM,"SYSTEM\CurrentControlSet\Services\nv4","ErrorControl",0x00010001,0x00000000
HKLM,"SYSTEM\CurrentControlSet\Services\nv4","Group",0x00000000,"Video"
HKLM,"SYSTEM\CurrentControlSet\Services\nv4","ImagePath",0x00020000,"system32\drivers\nv4_mini.sys"
HKLM,"SYSTEM\CurrentControlSet\Services\nv4","Start",0x00010001,0x00000004
HKLM,"SYSTEM\CurrentControlSet\Services\nv4","Type",0x00010001,0x00000001
HKLM,"SYSTEM\CurrentControlSet\Services\nv4\Device0","CapabilityOverride",0x00010001,0x00000000
HKLM,"SYSTEM\CurrentControlSet\Services\nv4\Device0","EnableVia4x",0x00010001,0x00000001
HKLM,"SYSTEM\CurrentControlSet\Services\nv4\Device0","InstalledDisplayDrivers",0x00010000,"nv4_disp"
HKLM,"SYSTEM\CurrentControlSet\Services\nv4\Device0","NVREGSWITCHES",0x00000001,43,52,54,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,36,34,30,2c,34,38,30,2c,38,2c,36,30,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,36,34,30,2c,34,38,30,2c,38,\
2c,36,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,36,34,30,2c,\
34,38,30,2c,38,2c,36,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,36,34,30,2c,34,38,30,2c,38,2c,36,30,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,36,34,30,2c,34,38,30,2c,38,2c,36,30,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,36,34,30,2c,34,38,30,2c,38,2c,36,30,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,36,34,30,2c,34,38,30,2c,38,\
2c,36,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,36,34,30,2c,\
34,38,30,2c,38,2c,36,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,36,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,36,30,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,36,30,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,36,30,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,44,4d,54,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,01,00,\
00,00,00,04,00,00,40,00,00,00,00,04,00,00,00,06,00,00,00,00,00,00,01,00,00,\
00,00,00,00,00,00,00,00,00,05,00,00,00,00,00,04,00,00,00,50,00,00,00,01,00,\
00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,99,99,99,99,99,\
99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,00,00,\
00,00
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","Attach.ToDesktop",0x00010001,1
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","Attach.RelativeX",0x00010001,0
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","Attach.RelativeY",0x00010001,0
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.BitsPerPel",0x00010001,16
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.XResolution",0x00010001,1152
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.YResolution",0x00010001,864
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.VRefresh",0x00010001,85
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.Flags",0x00010001,0
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.XPanning",0x00010001,0
HKLM,"SYSTEM\CurrentControlSet\Hardware Profiles\Current\System\CurrentControlSet\Services\nv4\Device0","DefaultSettings.YPanning",0x00010001,0
</PRE>
Feel free to adjust the DefaultSettings.BitsPerPel, DefaultSettings.XResolution,
DefaultSettings.YResolution and DefaultSettings.VRefresh (check the Display control
panel applet in MS-Windows for available settings for your card/monitor combo).<BR>
Search that same file for the "VGA miniport driver" section and change the "Start"
line in that section to:
<PRE>
HKLM,"SYSTEM\CurrentControlSet\Services\Vga","Start",0x00010001,0x00000004
</PRE>
(i.e. set the last value on that line to 4).<BR>
Rebuild the registry with the command "make registry" and copy the resulting SYSTEM file
to /ReactOS/System32/config. Reboot and enjoy.
</BODY>
</HTML>
-127
View File
@@ -1,127 +0,0 @@
/* $Id$
*
* Patch the NVidia miniport driver to work with ReactOS
*
* Should become obsolete
*/
#include <stdio.h>
#include <stdlib.h>
struct Patch
{
long Offset;
unsigned char ExpectedValue;
unsigned char NewValue;
};
static struct Patch Patches[ ] =
{
{ 0x1EBA9, 0x30, 0x3C },
{ 0x1EBAA, 0xC0, 0xF0 },
{ 0x1EC0B, 0x04, 0x01 },
{ 0x1EC67, 0x30, 0x3C },
{ 0x1EC68, 0xC0, 0xF0 }
};
int
main(int argc, char *argv[])
{
static char OriginalName[] = "nv4_mini.sys";
static char TempName[] = "nv4_mini.tmp";
static char BackupName[] = "nv4_mini.sys.orig";
FILE *File;
unsigned char *Buffer;
long Size;
unsigned n;
/* Read the whole file in memory */
File = fopen(OriginalName, "rb");
if (NULL == File)
{
perror("Unable to open original file");
exit(1);
}
if (fseek(File, 0, SEEK_END))
{
perror("Unable to determine file length");
fclose(File);
exit(1);
}
Size = ftell(File);
if (-1 == Size)
{
perror("Unable to determine file length");
fclose(File);
exit(1);
}
Buffer = malloc(Size);
if (NULL == Buffer)
{
perror("Can't allocate buffer");
fclose(File);
exit(1);
}
rewind(File);
if (Size != fread(Buffer, 1, Size, File))
{
perror("Error reading from original file");
free(Buffer);
fclose(File);
exit(1);
}
fclose(File);
/* Patch the file */
for (n = 0; n < sizeof(Patches) / sizeof(struct Patch); n++)
{
if (Buffer[Patches[n].Offset] != Patches[n].ExpectedValue)
{
fprintf(stderr, "Expected value 0x%02x at offset 0x%lx but found 0x%02x\n",
Patches[n].ExpectedValue, Patches[n].Offset,
Buffer[Patches[n].Offset]);
free(Buffer);
exit(1);
}
Buffer[Patches[n].Offset] = Patches[n].NewValue;
}
/* Write the new file */
File = fopen(TempName, "wb");
if (NULL == File)
{
perror("Unable to open output file");
free(Buffer);
exit(1);
}
if (Size != fwrite(Buffer, 1, Size, File))
{
perror("Error writing to output file");
fclose(File);
remove(TempName);
free(Buffer);
exit(1);
}
fclose(File);
free(Buffer);
/* Rename the original file, removing an existing backup */
remove(BackupName);
if (0 != rename(OriginalName, BackupName))
{
perror("Failed to rename original file");
remove(TempName);
exit(1);
}
/* Rename the new file */
if (0 != rename(TempName, OriginalName))
{
perror("Failed to rename new file");
remove(TempName);
rename(BackupName, OriginalName);
exit(1);
}
return 0;
}
File diff suppressed because it is too large Load Diff
-15
View File
@@ -1,15 +0,0 @@
typedef unsigned int ULONG,*PULONG;
typedef unsigned short USHORT,*PUSHORT;
typedef unsigned char UCHAR,*PUCHAR;
typedef signed int LONG,*PLONG;
typedef signed short SHORT,*PSHORT;
typedef signed char CHAR,*PCHAR,*LPSTR,*PSTR;
typedef void VOID,*PVOID;
typedef char BOOLEAN,*PBOOLEAN;
#define FALSE (0==1)
#define TRUE (1==1)
-264
View File
@@ -1,264 +0,0 @@
/* Table of DBX symbol codes for the GNU system.
Copyright (C) 1988, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* New stab from Solaris 2. This uses an n_type of 0, which in a.out files
overlaps the N_UNDF used for ordinary symbols. In ELF files, the
debug information is in a different file section, so there is no conflict.
This symbol's n_value gives the size of the string section associated
with this file. The symbol's n_strx (relative to the just-updated
string section start address) gives the name of the source file,
e.g. "foo.c", without any path information. The symbol's n_desc gives
the count of upcoming symbols associated with this file (not including
this one). */
__define_stab (N_UNDF, 0x00, "UNDF")
/* Global variable. Only the name is significant.
To find the address, look in the corresponding external symbol. */
__define_stab (N_GSYM, 0x20, "GSYM")
/* Function name for BSD Fortran. Only the name is significant.
To find the address, look in the corresponding external symbol. */
__define_stab (N_FNAME, 0x22, "FNAME")
/* Function name or text-segment variable for C. Value is its address.
Desc is supposedly starting line number, but GCC doesn't set it
and DBX seems not to miss it. */
__define_stab (N_FUN, 0x24, "FUN")
/* Data-segment variable with internal linkage. Value is its address.
"Static Sym". */
__define_stab (N_STSYM, 0x26, "STSYM")
/* BSS-segment variable with internal linkage. Value is its address. */
__define_stab (N_LCSYM, 0x28, "LCSYM")
/* Name of main routine. Only the name is significant. */
__define_stab (N_MAIN, 0x2a, "MAIN")
/* Solaris2: Read-only data symbols. */
__define_stab (N_ROSYM, 0x2c, "ROSYM")
/* Global symbol in Pascal.
Supposedly the value is its line number; I'm skeptical. */
__define_stab (N_PC, 0x30, "PC")
/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */
__define_stab (N_NSYMS, 0x32, "NSYMS")
/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */
__define_stab (N_NOMAP, 0x34, "NOMAP")
/* New stab from Solaris 2. Like N_SO, but for the object file. Two in
a row provide the build directory and the relative path of the .o from it.
Solaris2 uses this to avoid putting the stabs info into the linked
executable; this stab goes into the ".stab.index" section, and the debugger
reads the real stabs directly from the .o files instead. */
__define_stab (N_OBJ, 0x38, "OBJ")
/* New stab from Solaris 2. Options for the debugger, related to the
source language for this module. E.g. whether to use ANSI
integral promotions or traditional integral promotions. */
__define_stab (N_OPT, 0x3c, "OPT")
/* Register variable. Value is number of register. */
__define_stab (N_RSYM, 0x40, "RSYM")
/* Modula-2 compilation unit. Can someone say what info it contains? */
__define_stab (N_M2C, 0x42, "M2C")
/* Line number in text segment. Desc is the line number;
value is corresponding address. On Solaris2, the line number is
relative to the start of the current function. */
__define_stab (N_SLINE, 0x44, "SLINE")
/* Similar, for data segment. */
__define_stab (N_DSLINE, 0x46, "DSLINE")
/* Similar, for bss segment. */
__define_stab (N_BSLINE, 0x48, "BSLINE")
/* Sun's source-code browser stabs. ?? Don't know what the fields are.
Supposedly the field is "path to associated .cb file". THIS VALUE
OVERLAPS WITH N_BSLINE! */
__define_stab_duplicate (N_BROWS, 0x48, "BROWS")
/* GNU Modula-2 definition module dependency. Value is the modification time
of the definition file. Other is non-zero if it is imported with the
GNU M2 keyword %INITIALIZE. Perhaps N_M2C can be used if there
are enough empty fields? */
__define_stab(N_DEFD, 0x4a, "DEFD")
/* New in Solaris2. Function start/body/end line numbers. */
__define_stab(N_FLINE, 0x4C, "FLINE")
/* THE FOLLOWING TWO STAB VALUES CONFLICT. Happily, one is for Modula-2
and one is for C++. Still,... */
/* GNU C++ exception variable. Name is variable name. */
__define_stab (N_EHDECL, 0x50, "EHDECL")
/* Modula2 info "for imc": name,,0,0,0 according to Ultrix V4.0. */
__define_stab_duplicate (N_MOD2, 0x50, "MOD2")
/* GNU C++ `catch' clause. Value is its address. Desc is nonzero if
this entry is immediately followed by a CAUGHT stab saying what exception
was caught. Multiple CAUGHT stabs means that multiple exceptions
can be caught here. If Desc is 0, it means all exceptions are caught
here. */
__define_stab (N_CATCH, 0x54, "CATCH")
/* Structure or union element. Value is offset in the structure. */
__define_stab (N_SSYM, 0x60, "SSYM")
/* Solaris2: Last stab emitted for module. */
__define_stab (N_ENDM, 0x62, "ENDM")
/* Name of main source file.
Value is starting text address of the compilation.
If multiple N_SO's appear, the first to contain a trailing / is the
compilation directory. The first to not contain a trailing / is the
source file name, relative to the compilation directory. Others (perhaps
resulting from cfront) are ignored.
On Solaris2, value is undefined, but desc is a source-language code. */
__define_stab (N_SO, 0x64, "SO")
/* Automatic variable in the stack. Value is offset from frame pointer.
Also used for type descriptions. */
__define_stab (N_LSYM, 0x80, "LSYM")
/* Beginning of an include file. Only Sun uses this.
In an object file, only the name is significant.
The Sun linker puts data into some of the other fields. */
__define_stab (N_BINCL, 0x82, "BINCL")
/* Name of sub-source file (#include file).
Value is starting text address of the compilation. */
__define_stab (N_SOL, 0x84, "SOL")
/* Parameter variable. Value is offset from argument pointer.
(On most machines the argument pointer is the same as the frame pointer. */
__define_stab (N_PSYM, 0xa0, "PSYM")
/* End of an include file. No name.
This and N_BINCL act as brackets around the file's output.
In an object file, there is no significant data in this entry.
The Sun linker puts data into some of the fields. */
__define_stab (N_EINCL, 0xa2, "EINCL")
/* Alternate entry point. Value is its address. */
__define_stab (N_ENTRY, 0xa4, "ENTRY")
/* Beginning of lexical block.
The desc is the nesting level in lexical blocks.
The value is the address of the start of the text for the block.
The variables declared inside the block *precede* the N_LBRAC symbol.
On Solaris2, the value is relative to the start of the current function. */
__define_stab (N_LBRAC, 0xc0, "LBRAC")
/* Place holder for deleted include file. Replaces a N_BINCL and everything
up to the corresponding N_EINCL. The Sun linker generates these when
it finds multiple identical copies of the symbols from an include file.
This appears only in output from the Sun linker. */
__define_stab (N_EXCL, 0xc2, "EXCL")
/* Modula-2 scope information. Can someone say what info it contains? */
__define_stab (N_SCOPE, 0xc4, "SCOPE")
/* End of a lexical block. Desc matches the N_LBRAC's desc.
The value is the address of the end of the text for the block.
On Solaris2, the value is relative to the start of the current function. */
__define_stab (N_RBRAC, 0xe0, "RBRAC")
/* Begin named common block. Only the name is significant. */
__define_stab (N_BCOMM, 0xe2, "BCOMM")
/* End named common block. Only the name is significant
(and it should match the N_BCOMM). */
__define_stab (N_ECOMM, 0xe4, "ECOMM")
/* Member of a common block; value is offset within the common block.
This should occur within a BCOMM/ECOMM pair. */
__define_stab (N_ECOML, 0xe8, "ECOML")
/* Solaris2: Pascal "with" statement: type,,0,0,offset */
__define_stab (N_WITH, 0xea, "WITH")
/* These STAB's are used on Gould systems for Non-Base register symbols
or something like that. FIXME. I have assigned the values at random
since I don't have a Gould here. Fixups from Gould folk welcome... */
__define_stab (N_NBTEXT, 0xF0, "NBTEXT")
__define_stab (N_NBDATA, 0xF2, "NBDATA")
__define_stab (N_NBBSS, 0xF4, "NBBSS")
__define_stab (N_NBSTS, 0xF6, "NBSTS")
__define_stab (N_NBLCS, 0xF8, "NBLCS")
/* Second symbol entry containing a length-value for the preceding entry.
The value is the length. */
__define_stab (N_LENG, 0xfe, "LENG")
/* The above information, in matrix format.
STAB MATRIX
_________________________________________________
| 00 - 1F are not dbx stab symbols |
| In most cases, the low bit is the EXTernal bit|
| 00 UNDEF | 02 ABS | 04 TEXT | 06 DATA |
| 01 |EXT | 03 |EXT | 05 |EXT | 07 |EXT |
| 08 BSS | 0A INDR | 0C FN_SEQ | 0E WEAKA |
| 09 |EXT | 0B | 0D WEAKU | 0F WEAKT |
| 10 WEAKD | 12 COMM | 14 SETA | 16 SETT |
| 11 WEAKB | 13 | 15 | 17 |
| 18 SETD | 1A SETB | 1C SETV | 1E WARNING|
| 19 | 1B | 1D | 1F FN |
|_______________________________________________|
| Debug entries with bit 01 set are unused. |
| 20 GSYM | 22 FNAME | 24 FUN | 26 STSYM |
| 28 LCSYM | 2A MAIN | 2C ROSYM | 2E |
| 30 PC | 32 NSYMS | 34 NOMAP | 36 |
| 38 OBJ | 3A | 3C OPT | 3E |
| 40 RSYM | 42 M2C | 44 SLINE | 46 DSLINE |
| 48 BSLINE*| 4A DEFD | 4C FLINE | 4E |
| 50 EHDECL*| 52 | 54 CATCH | 56 |
| 58 | 5A | 5C | 5E |
| 60 SSYM | 62 ENDM | 64 SO | 66 |
| 68 | 6A | 6C | 6E |
| 70 | 72 | 74 | 76 |
| 78 | 7A | 7C | 7E |
| 80 LSYM | 82 BINCL | 84 SOL | 86 |
| 88 | 8A | 8C | 8E |
| 90 | 92 | 94 | 96 |
| 98 | 9A | 9C | 9E |
| A0 PSYM | A2 EINCL | A4 ENTRY | A6 |
| A8 | AA | AC | AE |
| B0 | B2 | B4 | B6 |
| B8 | BA | BC | BE |
| C0 LBRAC | C2 EXCL | C4 SCOPE | C6 |
| C8 | CA | CC | CE |
| D0 | D2 | D4 | D6 |
| D8 | DA | DC | DE |
| E0 RBRAC | E2 BCOMM | E4 ECOMM | E6 |
| E8 ECOML | EA WITH | EC | EE |
| F0 | F2 | F4 | F6 |
| F8 | FA | FC | FE LENG |
+-----------------------------------------------+
* 50 EHDECL is also MOD2.
* 48 BSLINE is also BROWS.
*/
-37
View File
@@ -1,37 +0,0 @@
#ifndef __GNU_STAB__
/* Indicate the GNU stab.h is in use. */
#define __GNU_STAB__
#define __define_stab(NAME, CODE, STRING) NAME=CODE,
#define __define_stab_duplicate(NAME, CODE, STRING) NAME=CODE,
enum __stab_debug_code
{
#include "stab.def"
LAST_UNUSED_STAB_CODE
};
#undef __define_stab
/* Definitions of "desc" field for N_SO stabs in Solaris2. */
#define N_SO_AS 1
#define N_SO_C 2
#define N_SO_ANSI_C 3
#define N_SO_CC 4 /* C++ */
#define N_SO_FORTRAN 5
#define N_SO_PASCAL 6
/* Solaris2: Floating point type values in basic types. */
#define NF_NONE 0
#define NF_SINGLE 1 /* IEEE 32-bit */
#define NF_DOUBLE 2 /* IEEE 64-bit */
#define NF_COMPLEX 3 /* Fortran complex */
#define NF_COMPLEX16 4 /* Fortran double complex */
#define NF_COMPLEX32 5 /* Fortran complex*16 */
#define NF_LDOUBLE 6 /* Long double (whatever that is) */
#endif /* __GNU_STAB_ */
-28
View File
@@ -1,28 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <io.h>
//#include <winnt.h>
#include <windows.h>
#include <kefuncs.h>
//#include <winnt.h>
#include <sys/types.h>
//#include <sys/wait.h>
//#include <sys/ioctl.h>
//#include <sys/signal.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
//#include <unistd.h>
//#include <linux/unistd.h>
#include "../../../../include/pe.h"
#include "stab_gnu.h"
//#include "retypes.h"
//#include "terminal.h"
//#include <termios.h>
#include "../shared/shared.h"
-430
View File
@@ -1,430 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
termínal.c
Abstract:
serial terminal for pICE headless mode
Environment:
User mode only
Author:
Klaus P. Gerlicher
Revision History:
23-Jan-2001: created
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
#if 0 //ei not ready
#include "stdinc.h"
#include <curses.h>
#define CONSOLE_WIDTH (80)
#define CONSOLE_HEIGHT (25)
USHORT major_version=0xFFFF,minor_version=0xFFFF,build_number=0xFFFF;
USHORT g_attr = 0;
USHORT usCurX,usCurY,xSize,ySize;
USHORT foreground_color_map[]=
{
};
USHORT background_color_map[]=
{
};
int fd_comm;
struct termios oldtio;
//************************************************************************
// CheckSum()
//
//************************************************************************
UCHAR CheckSum(LPSTR p,ULONG Len)
{
UCHAR ucCheckSum = 0;
ULONG i;
for(i=0;i<Len;i++)
{
ucCheckSum ^= *p++;
ucCheckSum += 1;
}
return ucCheckSum;
}
///************************************************************************
// ReadByte()
//
///************************************************************************
BOOLEAN ReadByte(PUCHAR pc)
{
return (read(fd_comm,pc,1) > 0);
}
///************************************************************************
// SendByte()
//
///************************************************************************
BOOLEAN SendByte(UCHAR c)
{
return (write(fd_comm,&c,1) > 0);
}
///************************************************************************
// ReadPacket()
//
///************************************************************************
PSERIAL_PACKET ReadPacket(void)
{
ULONG i;
PSERIAL_PACKET p;
SERIAL_PACKET_HEADER header;
PUCHAR pHeaderRaw,pData;
char temp[256];
ULONG ulCheckSum;
// read a packet header
pHeaderRaw = (PUCHAR)&header;
for(i=0;i<sizeof(SERIAL_PACKET_HEADER);i++)
{
// //printf("reading()\n");
if(! ReadByte(pHeaderRaw))
{
// //printf("no header byte read!\n");
return NULL;
}
pHeaderRaw++;
}
//printf("received header!\n");
ulCheckSum = header.packet_header_chksum;
header.packet_header_chksum = 0;
if(ulCheckSum != CheckSum((PUCHAR)&header,sizeof(SERIAL_PACKET_HEADER)) )
{
//printf("header checksum mismatch!\n");
tcflush(fd_comm, TCIFLUSH);
return NULL;
}
p = malloc(sizeof(SERIAL_PACKET_HEADER) + header.packet_size);
if(!p)
{
//printf("out of memory!\n");
return NULL;
}
PICE_memcpy(p,&header,sizeof(SERIAL_PACKET_HEADER));
sprintf(temp,"size %X chksum %x\n",header.packet_size,header.packet_chksum);
//printf(temp);
// read the attached data
pData = (PUCHAR)p + sizeof(header);
for(i=0;i<header.packet_size;i++)
{
if(! ReadByte(pData))
{
//printf("no data byte read!\n");
return NULL;
}
pData++;
}
//printf("received data!\n");
pData = (PUCHAR)p + sizeof(header);
if(header.packet_chksum != CheckSum(pData,header.packet_size))
{
free(p);
p = NULL;
//printf("data checksum mismatch!\n");
return NULL;
}
while(!SendByte(ACK));
return p;
}
///************************************************************************
// SendPacket()
//
///************************************************************************
BOOLEAN SendPacket(PSERIAL_PACKET p)
{
return TRUE;
}
void DeletePacket(PSERIAL_PACKET p)
{
free(p);
}
//************************************************************************
// SetupSerial()
//
//************************************************************************
BOOLEAN SetupSerial(ULONG port,ULONG baudrate)
{
struct termios newtio;
char* ports[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3"};
/*
Open modem device for reading and writing and not as controlling tty
because we don't want to get killed if linenoise sends CTRL-C.
*/
//printf("opening comm %s\n",ports[port-1]);
fd_comm = open(ports[port-1], O_RDWR | O_NOCTTY);
if (fd_comm <0)
{
perror(ports[port-1]);
exit(-1);
}
//printf("tcgetattr()\n");
tcgetattr(fd_comm,&oldtio); /* save current modem settings */
/*
Set bps rate and hardware flow control and 8n1 (8bit,no parity,1 stopbit).
Also don't hangup automatically and ignore modem status.
Finally enable receiving characters.
*/
newtio.c_cflag = baudrate | CS8 | CLOCAL | CREAD;
/*
Ignore bytes with parity errors and make terminal raw and dumb.
*/
newtio.c_iflag = IGNPAR;
/*
Raw output.
*/
newtio.c_oflag = 0;
/*
Don't echo characters because if you connect to a host it or your
modem will echo characters for you. Don't generate signals.
*/
newtio.c_lflag = 0;
/* blocking read until 1 char arrives */
newtio.c_cc[VMIN]=0;
newtio.c_cc[VTIME]=0;
/* now clean the modem line and activate the settings for modem */
//printf("tcflush()\n");
tcflush(fd_comm, TCIFLUSH);
//printf("tcsetattr()\n");
tcsetattr(fd_comm,TCSANOW,&newtio);
// NCURSES
initscr();
refresh();
return TRUE;
}
//************************************************************************
// CloseSerial()
//
//************************************************************************
void CloseSerial(void)
{
// NCURSES
endwin();
tcsetattr(fd_comm,TCSANOW,&oldtio); /* save current modem settings */
close(fd_comm);
}
//************************************************************************
// ClrLine()
//
//************************************************************************
void ClrLine(UCHAR line)
{
move(line,0);
}
//************************************************************************
// InvertLine()
//
//************************************************************************
void InvertLine(UCHAR line)
{
move(line,0);
}
//************************************************************************
// SetCursorPosition()
//
//************************************************************************
void SetCursorPosition(USHORT x, USHORT y)
{
move(y,x);
}
//************************************************************************
// GetCursorPosition()
//
//************************************************************************
void GetCursorPosition(PUSHORT px,PUSHORT py)
{
}
//************************************************************************
// SetCursorState()
//
//************************************************************************
void SetCursorState(UCHAR c)
{
}
//************************************************************************
// Print()
//
//************************************************************************
void Print(LPSTR p,USHORT x,USHORT y)
{
// save the cursor pos
GetCursorPosition(&usCurX,&usCurY);
if(y<25)
{
SetCursorPosition(x,y);
refresh();
addstr(p);
refresh();
SetCursorPosition(usCurX,usCurY);
}
}
//************************************************************************
// ProcessPacket()
//
//************************************************************************
void ProcessPacket(PSERIAL_PACKET p)
{
ULONG ulSize;
PSERIAL_DATA_PACKET pData;
pData = (PSERIAL_DATA_PACKET)((PUCHAR)p + sizeof(SERIAL_PACKET_HEADER));
ulSize = p->header.packet_size;
switch(pData->type)
{
case PACKET_TYPE_CONNECT:
{
PSERIAL_DATA_PACKET_CONNECT pDataConnect = (PSERIAL_DATA_PACKET_CONNECT)pData;
UCHAR i;
for(i=0;i<ySize;i++)
ClrLine(i);
SetCursorState(0);
SetCursorPosition(0,0);
// ResizeConsole(hConsole,pDataConnect->xsize,pDataConnect->ysize);
xSize = pDataConnect->xsize;
ySize = pDataConnect->ysize;
}
break;
case PACKET_TYPE_CLRLINE:
{
PSERIAL_DATA_PACKET_CLRLINE pDataClrLine = (PSERIAL_DATA_PACKET_CLRLINE)pData;
ClrLine(pDataClrLine->line);
}
break;
case PACKET_TYPE_INVERTLINE:
{
PSERIAL_DATA_PACKET_INVERTLINE pDataInvertLine = (PSERIAL_DATA_PACKET_INVERTLINE)pData;
InvertLine(pDataInvertLine->line);
}
break;
case PACKET_TYPE_PRINT:
{
PSERIAL_DATA_PACKET_PRINT pDataPrint = (PSERIAL_DATA_PACKET_PRINT)pData;
Print(pDataPrint->string,pDataPrint->x,pDataPrint->y);
}
break;
case PACKET_TYPE_CURSOR:
{
PSERIAL_DATA_PACKET_CURSOR pDataCursor = (PSERIAL_DATA_PACKET_CURSOR)pData;
SetCursorPosition(pDataCursor->x,pDataCursor->y);
SetCursorState(pDataCursor->state);
}
break;
case PACKET_TYPE_POLL:
{
PSERIAL_DATA_PACKET_POLL pDataPoll= (PSERIAL_DATA_PACKET_POLL)pData;
if( (major_version != pDataPoll->major_version) ||
(minor_version != pDataPoll->minor_version) ||
(build_number != pDataPoll->build_number) )
{
major_version = pDataPoll->major_version;
minor_version = pDataPoll->minor_version;
build_number = pDataPoll->build_number;
// SetAppTitle();
}
}
break;
default:
//printf("UNHANDLED\n");
break;
}
}
//************************************************************************
// DebuggerShell()
//
//************************************************************************
void DebuggerShell(void)
{
PSERIAL_PACKET p;
//printf("DebuggerShell()\n");
for(;;)
{
p = ReadPacket();
if(p)
{
ProcessPacket(p);
DeletePacket(p);
}
else
{
usleep(100*1000);
}
}
}
#endif
-34
View File
@@ -1,34 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
termínal.h
Abstract:
HEADER for terminal.c
Environment:
User mode only
Author:
Klaus P. Gerlicher
Revision History:
23-Jan-2001: created
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
BOOLEAN SetupSerial(ULONG port,ULONG baudrate);
void CloseSerial(void);
void DebuggerShell(void);
File diff suppressed because it is too large Load Diff
-752
View File
@@ -1,752 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
bp.c
Abstract:
setting, listing and removing breakpoints
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
13-Nov-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
////////////////////////////////////////////////////
// GLOBALS
////
char tempBp[1024];
ULONG OldInt3Handler=0;
SW_BP aSwBreakpoints[64]={{0,0,0,0},};
//*************************************************************************
// FindSwBp()
//
//*************************************************************************
PSW_BP FindSwBp(ULONG ulAddress)
{
ULONG i;
for(i=0;i<DIM(aSwBreakpoints);i++)
{
if(aSwBreakpoints[i].ulAddress == ulAddress && aSwBreakpoints[i].bUsed==TRUE && aSwBreakpoints[i].bVirtual==FALSE)
return &aSwBreakpoints[i];
}
return NULL;
}
//*************************************************************************
// FindEmptySwBpSlot()
//
//*************************************************************************
PSW_BP FindEmptySwBpSlot(void)
{
ULONG i;
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
if(aSwBreakpoints[i].bUsed == FALSE)
{
return &aSwBreakpoints[i];
}
}
return NULL;
}
//*************************************************************************
// FindVirtualSwBp()
//
//*************************************************************************
PSW_BP FindVirtualSwBp(LPSTR ModName,LPSTR szFunctionName)
{
ULONG i;
PSW_BP p;
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
if(p->bUsed == TRUE &&
p->bVirtual == TRUE &&
PICE_strcmpi(p->szModName,ModName)==0 &&
PICE_strcmpi(p->szFunctionName,szFunctionName)==0)
{
return p;
}
}
return NULL;
}
//*************************************************************************
// IsSwBpAtAddressInstalled()
//
//*************************************************************************
BOOLEAN IsSwBpAtAddressInstalled(ULONG ulAddress)
{
ULONG i;
for(i=0;i<DIM(aSwBreakpoints);i++)
{
if(aSwBreakpoints[i].ulAddress == ulAddress &&
aSwBreakpoints[i].bUsed == TRUE &&
aSwBreakpoints[i].bInstalled &&
aSwBreakpoints[i].bVirtual == FALSE)
return TRUE;
}
return FALSE;
}
//*************************************************************************
// IsSwBpAtAddress()
//
//*************************************************************************
BOOLEAN IsSwBpAtAddress(ULONG ulAddress)
{
ULONG i;
for(i=0;i<DIM(aSwBreakpoints);i++)
{
if(aSwBreakpoints[i].ulAddress == ulAddress && aSwBreakpoints[i].bUsed==TRUE && aSwBreakpoints[i].bVirtual==FALSE)
return TRUE;
}
return FALSE;
}
//*************************************************************************
// NeedToReInstallSWBreakpoints()
//
//*************************************************************************
BOOLEAN NeedToReInstallSWBreakpoints(ULONG ulAddress,BOOLEAN bUseAddress)
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ULONG i;
ENTER_FUNC();
DPRINT((0,"NeedToReInstallSWBreakpoint() for %x (bUseAddress = %s)\n",ulAddress,bUseAddress?"TRUE":"FALSE"));
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
if(bUseAddress)
{
if(p->bUsed == TRUE && p->bInstalled == FALSE && p->ulAddress==ulAddress && p->bVirtual==FALSE)
{
if(IsAddressValid(p->ulAddress))
{
DPRINT((0,"NeedToReInstallSWBreakpoint(): [1] found BP\n"));
bResult = TRUE;
break;
}
}
}
else
{
if(p->bUsed == TRUE && p->bInstalled == FALSE && p->bVirtual == FALSE)
{
if(IsAddressValid(p->ulAddress))
{
DPRINT((0,"NeedToReInstallSWBreakpoint(): [2] found BP\n"));
bResult = TRUE;
break;
}
}
}
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// ReInstallSWBreakpoint()
//
//*************************************************************************
BOOLEAN ReInstallSWBreakpoint(ULONG ulAddress)
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ULONG i;
ENTER_FUNC();
DPRINT((0,"ReInstallSWBreakpoint()\n"));
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
if(p->bUsed == TRUE && p->bInstalled == FALSE && p->ulAddress == ulAddress && p->bVirtual == FALSE)
{
if(IsAddressValid(p->ulAddress))
{
BOOLEAN isWriteable;
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
SetAddressWriteable(p->ulAddress,TRUE);
*(PUCHAR)(p->ulAddress) = 0xCC;
if( !isWriteable )
SetAddressWriteable(p->ulAddress,FALSE);
p->bInstalled = TRUE;
bResult = TRUE;
}
}
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// InstallSWBreakpoint()
//
//*************************************************************************
BOOLEAN InstallSWBreakpoint(ULONG ulAddress,BOOLEAN bPermanent,void (*SWBreakpointCallback)(void))
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ENTER_FUNC();
DPRINT((0,"InstallSWBreakpoint()\n"));
// check if page is present
// TODO: must also check if it's a writable page
if(IsAddressValid(ulAddress) )
{
DPRINT((0,"InstallSWBreakpoint(): %.8X is valid, writable? %d\n",ulAddress,IsAddressWriteable(ulAddress)));
DPRINT((0,"pde: %x, pte: %x\n", *(ADDR_TO_PDE(ulAddress)), *(ADDR_TO_PTE(ulAddress))));
if((p = FindSwBp(ulAddress))==NULL)
{
DPRINT((0,"InstallSWBreakpoint(): %.8X is free\n",ulAddress));
if( (p=FindEmptySwBpSlot()) )
{
BOOLEAN isWriteable;
DPRINT((0,"InstallSWBreakpoint(): found empty slot\n"));
DPRINT((0,"InstallSWBreakpoint(): %x value: %x", ulAddress, *(PUCHAR)ulAddress));
p->ucOriginalOpcode = *(PUCHAR)ulAddress;
//allow writing to page
if( !( isWriteable = IsAddressWriteable(ulAddress) ) )
SetAddressWriteable(ulAddress,TRUE);
DPRINT((0,"writing breakpoint\n"));
*(PUCHAR)ulAddress = 0xCC;
DPRINT((0,"restoring page access\n"));
if( !isWriteable )
SetAddressWriteable(ulAddress,FALSE);
p->bUsed = TRUE;
p->bInstalled = TRUE;
// find next address
p->ulAddress = ulAddress;
Disasm(&ulAddress,(PUCHAR)&tempBp);
p->ulNextInstr = ulAddress;
p->bPermanent = bPermanent;
if(bPermanent)
p->Callback = SWBreakpointCallback;
else
p->Callback = NULL;
bResult = TRUE;
}
}
else
{
DPRINT((0,"InstallSWBreakpoint(): %.8X is already used\n",ulAddress));
if(p->bPermanent)
{
DPRINT((0,"InstallSWBreakpoint(): %.8X is a permanent breakpoint\n",ulAddress));
}
}
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// InstallVirtualSWBreakpoint()
//
//*************************************************************************
BOOLEAN InstallVirtualSWBreakpoint(LPSTR ModName,LPSTR FunctionName)
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ENTER_FUNC();
DPRINT((0,"InstallVirtualSWBreakpoint(%s!%s)\n",ModName,FunctionName));
if( (p=FindEmptySwBpSlot()) )
{
DPRINT((0,"InstallVirtualSWBreakpoint(): found empty slot\n"));
p->bUsed = TRUE;
p->bInstalled = TRUE;
p->bVirtual = TRUE;
p->Callback = NULL;
PICE_strcpy(p->szModName,ModName);
PICE_strcpy(p->szFunctionName,FunctionName);
bResult = TRUE;
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// TryToInstallVirtualSWBreakpoints()
//
//*************************************************************************
void TryToInstallVirtualSWBreakpoints(void)
{
ULONG i,ulAddress;
PDEBUG_MODULE pMod;
PSW_BP p;
DPRINT((0,"TryToInstallVirtualSWBreakpoints()\n"));
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
if(p->bUsed == TRUE && p->bVirtual)
{
if((pMod = IsModuleLoaded(p->szModName)))
{
if((ulAddress = FindFunctionInModuleByName(p->szFunctionName,pMod)))
{
if((p = FindVirtualSwBp(p->szModName,p->szFunctionName)))
{
ULONG ulAddressWithOffset = ulAddress+p->ulAddress;
DPRINT((0,"TryToInstallVirtualSWBreakpoints(): ulAddressWithOffset = %x (offset = %x)\n",ulAddressWithOffset,p->ulAddress));
if(IsAddressValid(ulAddressWithOffset))
{
BOOLEAN isWriteable;
DPRINT((0,"TryToInstallVirtualSWBreakpoints(): installing...\n"));
p->ucOriginalOpcode = *(PUCHAR)ulAddressWithOffset;
//allow writing to page
if( !( isWriteable = IsAddressWriteable(ulAddressWithOffset) ) )
SetAddressWriteable(ulAddressWithOffset,TRUE);
*(PUCHAR)ulAddressWithOffset = 0xCC;
if( !isWriteable )
SetAddressWriteable(ulAddressWithOffset,FALSE);
p->bUsed = TRUE;
p->bInstalled = TRUE;
p->bVirtual = FALSE;
// find next address
p->ulAddress = ulAddressWithOffset;
Disasm(&ulAddressWithOffset,(PUCHAR)&tempBp);
p->ulNextInstr = ulAddressWithOffset;
p->bPermanent = FALSE;
p->Callback = NULL;
}
else
{
DPRINT((0,"TryToInstallVirtualSWBreakpoints(): not valid address\n"));
PICE_memset(p,0,sizeof(*p));
}
}
}
}
}
}
}
//*************************************************************************
// RemoveSWBreakpoint()
//
// removes breakpoint from breakpoint list
//*************************************************************************
BOOLEAN RemoveSWBreakpoint(ULONG ulAddress)
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ENTER_FUNC();
DPRINT((0,"RemoveSWBreakpoint()\n"));
if( (p = FindSwBp(ulAddress)) )
{
if(IsAddressValid(ulAddress) && p->bInstalled == TRUE && p->bVirtual==FALSE)
{
BOOLEAN isWriteable;
if( !( isWriteable = IsAddressWriteable(ulAddress) ) )
SetAddressWriteable(ulAddress,TRUE);
// restore original opcode
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
if( !isWriteable )
SetAddressWriteable(ulAddress,FALSE);
}
PICE_memset(p,0,sizeof(*p));
bResult = TRUE;
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// DeInstallSWBreakpoint()
//
//*************************************************************************
BOOLEAN DeInstallSWBreakpoint(ULONG ulAddress)
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ENTER_FUNC();
DPRINT((0,"DeInstallSWBreakpoint()\n"));
if( (p = FindSwBp(ulAddress)) )
{
if(IsAddressValid(ulAddress) && p->bInstalled == TRUE && p->bVirtual==FALSE)
{
BOOLEAN isWriteable;
if( !( isWriteable = IsAddressWriteable(ulAddress) ) )
SetAddressWriteable(ulAddress,TRUE);
// restore original opcode
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
if( !isWriteable )
SetAddressWriteable(ulAddress,FALSE);
}
p->bInstalled = FALSE;
bResult = TRUE;
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// RemoveAllSWBreakpoints()
//
//*************************************************************************
BOOLEAN RemoveAllSWBreakpoints(BOOLEAN bEvenPermanents)
{
PSW_BP p;
BOOLEAN bResult = FALSE;
ULONG i;
ENTER_FUNC();
DPRINT((0,"RemoveAllSWBreakpoint()\n"));
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
if(p->bUsed == TRUE)
{
if(bEvenPermanents)
{
if(IsAddressValid(p->ulAddress) && p->bVirtual==FALSE)
{
BOOLEAN isWriteable;
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
SetAddressWriteable(p->ulAddress,TRUE);
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
if( !isWriteable )
SetAddressWriteable(p->ulAddress,FALSE);
bResult = TRUE;
}
PICE_memset(p,0,sizeof(*p));
}
else
{
if(!p->bPermanent)
{
if(IsAddressValid(p->ulAddress) && p->bVirtual==FALSE)
{
BOOLEAN isWriteable;
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
SetAddressWriteable(p->ulAddress,TRUE);
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
if( !isWriteable )
SetAddressWriteable(p->ulAddress,FALSE);
bResult = TRUE;
}
PICE_memset(p,0,sizeof(*p));
}
}
}
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// IsPermanentSWBreakpoint()
//
//*************************************************************************
PSW_BP IsPermanentSWBreakpoint(ULONG ulAddress)
{
PSW_BP p;
ULONG i;
ENTER_FUNC();
DPRINT((0,"IsPermanentSWBreakpoint(%.8X)\n",ulAddress));
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(aSwBreakpoints[0]));i++)
{
p = &aSwBreakpoints[i];
if(p->ulAddress == ulAddress &&
p->bUsed == TRUE &&
p->bPermanent == TRUE)
{
LEAVE_FUNC();
return p;
}
}
LEAVE_FUNC();
return NULL;
}
//*************************************************************************
// ListSWBreakpoints()
//
//*************************************************************************
void ListSWBreakpoints(void)
{
PSW_BP p;
ULONG i;
LPSTR pSymbolName;
PDEBUG_MODULE pMod;
ENTER_FUNC();
DPRINT((0,"ListSWBreakpoints()\n"));
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
if(p->bUsed == TRUE && p->bVirtual == FALSE)
{
if((pSymbolName = FindFunctionByAddress(p->ulAddress,NULL,NULL)) )
{
pMod = FindModuleFromAddress(p->ulAddress);
PICE_sprintf(tempBp,"[%u] %.8X (%S!%s) %s\n",i,p->ulAddress,pMod->name,pSymbolName,p->bPermanent?"PERMANENT":"");
}
else
{
if(ScanExportsByAddress(&pSymbolName,p->ulAddress))
PICE_sprintf(tempBp,"[%u] %.8X (%s) %s\n",i,p->ulAddress,pSymbolName,p->bPermanent?"PERMANENT":"");
else
PICE_sprintf(tempBp,"[%u] %.8X (no symbol) %s\n",i,p->ulAddress,p->bPermanent?"PERMANENT":"");
}
Print(OUTPUT_WINDOW,tempBp);
}
else if(p->bUsed == TRUE)
{
PICE_sprintf(tempBp,"[%u] xxxxxxxx (%s!%s) VIRTUAL\n",i,p->szModName,p->szFunctionName);
Print(OUTPUT_WINDOW,tempBp);
}
}
LEAVE_FUNC();
}
//*************************************************************************
// RevirtualizeBreakpointsForModule()
//
//*************************************************************************
void RevirtualizeBreakpointsForModule(PDEBUG_MODULE pMod)
{
ULONG i,start,end;
PSW_BP p;
char temp[DEBUG_MODULE_NAME_LEN];
DPRINT((0,"RevirtualizeBreakpointsForModule(%x)\n",(ULONG)pMod));
if(IsRangeValid((ULONG)pMod,sizeof(DEBUG_MODULE)) )
{
start = (ULONG)pMod->BaseAddress;
end = (ULONG)pMod->BaseAddress+pMod->size;
DPRINT((0,"RevirtualizeBreakpointsForModule(): module %x (%x-%x)\n",(ULONG)pMod,start,end));
// go through all breakpoints
for(i=0;i<(sizeof(aSwBreakpoints)/sizeof(SW_BP));i++)
{
p = &aSwBreakpoints[i];
// if it's used and installed and not virtual
if(p->bUsed && p->bInstalled && p->bVirtual == FALSE)
{
// make sure we're in module's bound
if(p->ulAddress>=start && p->ulAddress<end)
{
LPSTR pFind;
ULONG ulFunctionAddress;
DPRINT((0,"RevirtualizeBreakpointsForModule(): module breakpoint %u\n",i));
// find the function in which this breakpoint resides
if(ScanExportsByAddress(&pFind,p->ulAddress))
{
// from now on it's virtual again
p->bVirtual = TRUE;
if(IsAddressValid(p->ulAddress) )
{
BOOLEAN isWriteable;
if( !( isWriteable = IsAddressWriteable(p->ulAddress) ) )
SetAddressWriteable(p->ulAddress,TRUE);
DPRINT((0,"RevirtualizeBreakpointsForModule(): restoring original opcode @ %x\n",p->ulAddress));
*(PUCHAR)(p->ulAddress) = p->ucOriginalOpcode;
if( !isWriteable )
SetAddressWriteable(p->ulAddress,FALSE);
}
else
{
DPRINT((0,"RevirtualizeBreakpointsForModule(): could not restore original opcode @ %x\n",p->ulAddress));
}
// skip past the module separator
while(*pFind!='!')pFind++;
pFind++;
// remember the function and the module for reinstallation
CopyWideToAnsi(temp,pMod->name);
PICE_strcpy(p->szModName,temp);
PICE_strcpy(p->szFunctionName,pFind);
DPRINT((0,"RevirtualizeBreakpointsForModule(): %s!%s\n",p->szModName,p->szFunctionName));
// if function name contains a '+' it's an offset
pFind = p->szFunctionName;
while(*pFind!=0)
{
DPRINT((0,"RevirtualizeBreakpointsForModule(): [1] %s\n",pFind));
// found any offset to function
if(*pFind=='+')
{
*pFind=0;
break;
}
pFind++;
}
DPRINT((0,"RevirtualizeBreakpointsForModule(): [2] %s\n",p->szFunctionName));
if(ScanExports(p->szFunctionName,&ulFunctionAddress))
{
p->ulAddress -= ulFunctionAddress;
DPRINT((0,"RevirtualizeBreakpointsForModule(): [1] function @ %x offset = %x\n",ulFunctionAddress,p->ulAddress));
}
else
{
if((ulFunctionAddress = FindFunctionInModuleByName(p->szFunctionName,pMod)) )
{
p->ulAddress -= ulFunctionAddress;
DPRINT((0,"RevirtualizeBreakpointsForModule(): [2] function @ %x offset = %x\n",ulFunctionAddress,p->ulAddress));
}
else
{
DPRINT((0,"RevirtualizeBreakpointsForModule(): Breakpoint %u could not be virtualized properly!\n",i));
PICE_sprintf(tempBp,"Breakpoint %u could not be virtualized properly!\n",i);
Print(OUTPUT_WINDOW,tempBp);
}
}
}
else
{
DPRINT((0,"RevirtualizeBreakpointsForModule(): function for %x not found!\n",p->ulAddress));
PICE_memset(p,0,sizeof(*p));
}
}
}
}
}
}
//*************************************************************************
// NewInt3Handler()
//
//*************************************************************************
__asm__ ("\n\t \
NewInt3Handler:\n\t \
pushl $" STR(REASON_INT3) "\n\t \
// call debugger loop\n\t \
jmp NewInt31Handler\n\t \
");
//*************************************************************************
// InstallInt3Hook()
//
//*************************************************************************
void InstallInt3Hook(void)
{
ULONG LocalInt3Handler;
ENTER_FUNC();
DPRINT((0,"enter InstallInt3Hook()...\n"));
MaskIrqs();
if(!OldInt3Handler)
{
PICE_memset(aSwBreakpoints,0,sizeof(aSwBreakpoints));
__asm__("mov $NewInt3Handler,%0"
:"=r" (LocalInt3Handler)
:
:"eax");
OldInt3Handler=SetGlobalInt(0x03,(ULONG)LocalInt3Handler);
}
UnmaskIrqs();
DPRINT((0,"leave InstallInt3Hook()...\n"));
LEAVE_FUNC();
}
//*************************************************************************
// DeInstallInt3Hook()
//
//*************************************************************************
void DeInstallInt3Hook(void)
{
ENTER_FUNC();
DPRINT((0,"enter DeInstallInt3Hook()...\n"));
MaskIrqs();
if(OldInt3Handler)
{
RemoveAllSWBreakpoints(TRUE);
SetGlobalInt(0x03,(ULONG)OldInt3Handler);
OldInt3Handler=0;
}
UnmaskIrqs();
DPRINT((0,"leave DeInstallInt3Hook()...\n"));
LEAVE_FUNC();
}
-62
View File
@@ -1,62 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
bp.h
Abstract:
HEADER for bp.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.
--*/
typedef struct _SW_BP
{
ULONG ulAddress;
ULONG ulNextInstr;
UCHAR ucOriginalOpcode;
BOOLEAN bUsed;
BOOLEAN bInstalled;
BOOLEAN bPermanent;
BOOLEAN bVirtual;
char szModName[128];
char szFunctionName[128];
void (*Callback)(void);
}SW_BP,*PSW_BP;
BOOLEAN InstallSWBreakpoint(ULONG ulAddress,BOOLEAN bPermanent,void (*SWBreakpointCallback)(void));
BOOLEAN InstallVirtualSWBreakpoint(LPSTR ModName,LPSTR Function);
void TryToInstallVirtualSWBreakpoints(void);
BOOLEAN DeInstallSWBreakpoint(ULONG ulAddress);
BOOLEAN RemoveSWBreakpoint(ULONG ulAddress);
BOOLEAN NeedToReInstallSWBreakpoints(ULONG ulAddress,BOOLEAN bUseAddress);
BOOLEAN ReInstallSWBreakpoint(ULONG ulAddress);
BOOLEAN RemoveAllSWBreakpoints(BOOLEAN bEvenPermanents);
PSW_BP IsPermanentSWBreakpoint(ULONG ulAddress);
void ListSWBreakpoints(void);
PSW_BP FindSwBp(ULONG ulAddress);
BOOLEAN IsSwBpAtAddress(ULONG ulAddress);
BOOLEAN IsSwBpAtAddressInstalled(ULONG ulAddress);
void RevirtualizeBreakpointsForModule(PDEBUG_MODULE pMod);
void InstallInt3Hook(void);
void DeInstallInt3Hook(void);
File diff suppressed because it is too large Load Diff
-133
View File
@@ -1,133 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
dblflt.c
Abstract:
handle double faults on x86
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
13-Nov-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
////////////////////////////////////////////////////
// GLOBALS
////
ULONG OldDblFltHandler = 0;
////////////////////////////////////////////////////
// FUNCTIONS
////
//*************************************************************************
// HandleDoubleFault()
//
//*************************************************************************
void HandleDoubleFault(FRAME* ptr)
{
DPRINT((0,"HandleDoubleFault(): ptr = %x\n",ptr));
}
//*************************************************************************
// NewDblFltHandler()
//
//*************************************************************************
__asm__ (" \
NewDblFltHandler:\n\t \
pushfl\n\t \
cli;\n\t \
cld;\n\t \
pushal;\n\t \
pushl %ds;\n\t \
\n\t \
// setup default data selectors\n\t \
movw %ss,%ax\n\t \
movw %ax,%ds\n\t \
\n\t \
// get frame ptr\n\t \
lea 40(%esp),%eax\n\t \
pushl %eax\n\t \
call _HandleDoubleFault\n\t \
addl $4,%esp\n\t \
\n\t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
// remove error code from stack and replace with reason code\n\t \
movl $" STR(REASON_DOUBLE_FAULT) ",(%esp)\n\t \
// call debugger loop\n\t \
jmp NewInt31Handler\n\t");
//*************************************************************************
// InstallDblFltHook()
//
//*************************************************************************
void InstallDblFltHook(void)
{
ULONG LocalDblFltHandler;
ENTER_FUNC();
MaskIrqs();
if(!OldDblFltHandler)
{
__asm__("mov $NewDblFltHandler,%0"
:"=r" (LocalDblFltHandler)
:
:"eax");
OldDblFltHandler=SetGlobalInt(0x08,(ULONG)LocalDblFltHandler);
}
UnmaskIrqs();
LEAVE_FUNC();
}
//*************************************************************************
// DeInstallDblFltHook()
//
//*************************************************************************
void DeInstallDblFltHook(void)
{
ENTER_FUNC();
MaskIrqs();
if(OldDblFltHandler)
{
RemoveAllSWBreakpoints(TRUE);
SetGlobalInt(0x08,(ULONG)OldDblFltHandler);
OldDblFltHandler=0;
}
UnmaskIrqs();
LEAVE_FUNC();
}
// EOF
-32
View File
@@ -1,32 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
dblflt.h
Abstract:
HEADER for dblflt.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.
--*/
void InstallDblFltHook(void);
void DeInstallDblFltHook(void);
-192
View File
@@ -1,192 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
debug.c
Abstract:
debug output
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
04-Feb-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#ifdef DEBUG
#include "remods.h"
#include "precomp.h"
#include <stdarg.h>
#include "serial.h"
#include "serial_port.h"
#define STANDARD_DEBUG_PREFIX "pICE: "
////////////////////////////////////////////////////
// GLOBALS
////
LONG lDebugLevel = 10;
ULONG ulDebugFlags;
char tempDebug[2048];
USHORT usDebugPortBase;
extern BOOLEAN bIsPrintkPatched;
////////////////////////////////////////////////////
// FUNCTIONS
////
void DebugSendString(LPSTR s);
//*************************************************************************
// Pice_dprintf()
//
// internal debug print
//*************************************************************************
VOID Pice_dprintf(ULONG DebugLevel, PCHAR DebugMessage, ...)
{
va_list ap;
va_start(ap, DebugMessage);
if (/*DebugLevel <= lDebugLevel*/ DebugLevel == 2)
{
save_flags(ulDebugFlags);
cli();
PICE_vsprintf(tempDebug, DebugMessage, ap);
//ei DebugSendString(tempDebug);
Print(OUTPUT_WINDOW, tempDebug);
//DbgPrint("%s", tempDebug);
restore_flags(ulDebugFlags);
}
va_end(ap);
}
//************************************************************************
// SendByte()
//
// Output a character to the serial port
//************************************************************************
BOOLEAN DebugSendByte(UCHAR x)
{
ULONG timeout;
timeout = 0x00FFFFL;
// Wait for transmitter to clear
while ((inportb((USHORT)(usDebugPortBase + LSR)) & XMTRDY) == 0)
if (!(--timeout))
{
return FALSE;
}
outportb((USHORT)(usDebugPortBase + TXR), x);
return TRUE;
}
///************************************************************************
// DebugSetSpeed()
//
///************************************************************************
void DebugSendString(LPSTR s)
{
ULONG len = PICE_strlen(s),i;
for(i=0;i<len;i++)
{
DebugSendByte(s[i]);
}
DebugSendByte('\r');
}
///************************************************************************
// DebugSetSpeed()
//
///************************************************************************
void DebugSetSpeed(ULONG baudrate)
{
UCHAR c;
ULONG divisor;
divisor = (ULONG) (115200L/baudrate);
c = inportb((USHORT)(usDebugPortBase + LCR));
outportb((USHORT)(usDebugPortBase + LCR), (UCHAR)(c | 0x80)); // Set DLAB
outportb((USHORT)(usDebugPortBase + DLL), (UCHAR)(divisor & 0x00FF));
outportb((USHORT)(usDebugPortBase + DLH), (UCHAR)((divisor >> 8) & 0x00FF));
outportb((USHORT)(usDebugPortBase + LCR), c); // Reset DLAB
}
///************************************************************************
// DebugSetOthers()
//
// Set other communications parameters
//************************************************************************
void DebugSetOthers(ULONG Parity, ULONG Bits, ULONG StopBit)
{
ULONG setting;
UCHAR c;
if (usDebugPortBase == 0) return ;
if (Bits < 5 || Bits > 8) return ;
if (StopBit != 1 && StopBit != 2) return ;
if (Parity != NO_PARITY && Parity != ODD_PARITY && Parity != EVEN_PARITY)
return;
setting = Bits-5;
setting |= ((StopBit == 1) ? 0x00 : 0x04);
setting |= Parity;
c = inportb((USHORT)(usDebugPortBase + LCR));
outportb((USHORT)(usDebugPortBase + LCR), (UCHAR)(c & ~0x80)); // Reset DLAB
// no ints
outportb((USHORT)(usDebugPortBase + IER), (UCHAR)0);
outportb((USHORT)(usDebugPortBase + FCR), (UCHAR)0);
outportb((USHORT)(usDebugPortBase + LCR), (UCHAR)setting);
outportb((USHORT)(usDebugPortBase + MCR), DTR | RTS);
return ;
}
///************************************************************************
// DebugSetupSerial()
//
///************************************************************************
void DebugSetupSerial(ULONG port,ULONG baudrate)
{
USHORT ports[]={COM1BASE,COM2BASE};
#if 0 //ei temporary
usDebugPortBase = ports[port-1];
DebugSetOthers(NO_PARITY,8,1);
DebugSetSpeed(baudrate);
#endif
}
#endif // DEBUG
// EOF
-47
View File
@@ -1,47 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
debug.h
Abstract:
HEADER for debug.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.
--*/
#ifdef DEBUG
#define ENTER_FUNC() DPRINT((0,"enter "__FUNCTION__"()\n"))
#define LEAVE_FUNC() DPRINT((0,"leave "__FUNCTION__"()\n"))
VOID Pice_dprintf(ULONG DebugLevel, PCHAR DebugMessage, ...);
#define DPRINT(arg) Pice_dprintf arg
#else // DEBUG
#define ENTER_FUNC()
#define LEAVE_FUNC()
#define DPRINT(arg)
#endif // DEBUG
@@ -1,716 +0,0 @@
/*++
Copyright (c) 2000-2001 Goran Devic
Modified (c) 2001 Klaus P. Gerlicher
Module Name:
disassembler.c
Abstract:
line disassembler
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Goran Devic
Revision History:
17-Mar-2000: Original (Goran Devic)
26-Apr-2000: Major rewrite, added coprocessor instructions (Goran Devic)
04-Nov-2000: Modified for LinIce (Goran Devic)
05-Jan-2001: Modified for pICE (Klaus P. Gerlicher)
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
/*******************************************************************************
* Include Files *
******************************************************************************/
#include "remods.h"
#include "precomp.h"
#include "disassemblerdata.h" // Include its own data
/******************************************************************************
*
* This structure is used to pass parameters and options to the
* line disassembler.
*
******************************************************************************/
typedef struct
{
ULONG dwFlags; // Generic flags (described below)
USHORT wSel; // Selector to use to fetch code
UCHAR *bpTarget; // Target pointer to disassemble
UCHAR *szDisasm; // String where to put ascii result
UCHAR Codes[20]; // Buffer where to store code UCHARs
UCHAR bAsciiLen; // Length of the ascii result
UCHAR bInstrLen; // Instruction lenght in UCHARs
int nDisplacement; // Scanner: possible constant displacement
int nScanEnum; // Scanner: specific flags SCAN_*
} TDisassembler;
// dwFlags contains a set of boolean flags with the following functionality
#define DIS_DATA32 0x0001 // Data size 16/32 bits (0/1)
#define DIS_GETDATASIZE(flags) ((flags)&DIS_DATA32)
#define DIS_ADDRESS32 0x0002 // Address size 16/32 bits (0/1)
#define DIS_GETADDRSIZE(flags) (((flags)&DIS_ADDRESS32)?1:0)
#define DIS_SEGOVERRIDE 0x0004 // Default segment has been overriden
#define DIS_REP 0x0100 // Return: REP prefix found (followed by..)
#define DIS_REPNE 0x0200 // Return: REPNE prefix found
#define DIS_GETREPENUM(flags) (((flags)>>8)&3)
#define DIS_ILLEGALOP 0x8000 // Return: illegal opcode
/******************************************************************************
* *
* Global Variables *
* *
******************************************************************************/
/******************************************************************************
* *
* External functions (optional) *
* *
******************************************************************************/
/******************************************************************************
* *
* Local Defines, Variables and Macros *
* *
******************************************************************************/
UCHAR GetUCHAR(ULONG addr)
{
if(IsAddressValid(addr))
return *(PUCHAR)addr;
else
return 0x82; // INVALID OPCODE
}
static UCHAR GetNextUCHAR(USHORT sel, UCHAR *offset, UCHAR *pCode)
{
pCode[0] = GetUCHAR((ULONG) offset + 0) & 0xFF;
return( pCode[0] );
}
static USHORT GetNextUSHORT(USHORT sel, UCHAR *offset, UCHAR *pCode)
{
pCode[0] = GetUCHAR((ULONG) offset + 0) & 0xFF;
pCode[1] = GetUCHAR((ULONG) offset + 1) & 0xFF;
return( *(USHORT *) pCode );
}
static ULONG GetNextULONG(USHORT sel, UCHAR *offset, UCHAR *pCode)
{
pCode[0] = GetUCHAR((ULONG) offset + 0) & 0xFF;
pCode[1] = GetUCHAR((ULONG) offset + 1) & 0xFF;
pCode[2] = GetUCHAR((ULONG) offset + 2) & 0xFF;
pCode[3] = GetUCHAR((ULONG) offset + 3) & 0xFF;
return( *(ULONG *) pCode );
}
#define NEXTUCHAR GetNextUCHAR( pDis->wSel, bpTarget, bpCode); bpCode += 1; bpTarget += 1; bInstrLen += 1
#define NEXTUSHORT GetNextUSHORT( pDis->wSel, bpTarget, bpCode); bpCode += 2; bpTarget += 2; bInstrLen += 2
#define NEXTULONG GetNextULONG(pDis->wSel, bpTarget, bpCode); bpCode += 4; bpTarget += 4; bInstrLen += 4
/******************************************************************************
* *
* Functions *
* *
******************************************************************************/
/******************************************************************************
* *
* UCHAR Disassembler( TDisassembler *pDis ); *
* *
*******************************************************************************
*
* This is a generic Intel line disassembler.
*
* Where:
* TDisassembler:
* bpTarget is the address of instruction to disassemble
* szDisasm is the address of the buffer to print a line into
* dwFlags contains the default operand and address bits
* pCode is the address to store code UCHARs (up to 16)
*
* Disassembled instruction is stored as an ASCIIZ string pointed by
* szDisasm pointer (from the pDis structure).
*
* Returns:
* TDisassembler:
* *szDisasm contains the disassembled instruction string
* bAsciiLen is set to the length of the printed string
* bInstrLen is set to instruction length in UCHARs
* dwFlags - has operand and address size flags adjusted
* - DIS_ILLEGALOP set if that was illegal instruction
* UCHAR - instruction length in UCHARs
*
******************************************************************************/
UCHAR Disassembler( TDisassembler *pDis )
{
TOpcodeData *p; // Pointer to a current instruction record
UCHAR *bpTarget; // Pointer to the target code to be disassembled
UCHAR *bpCode; // Pointer to code UCHARs
ULONG arg; // Argument counter
char *sPtr; // Message selection pointer
int nPos; // Printing position in the output string
UCHAR *pArg; // Pointer to record where instruction arguments are
ULONG dwULONG; // Temporary ULONG storage
USHORT wUSHORT; // Temporary USHORT storage
UCHAR bUCHAR; // Temporary UCHAR storage
UCHAR bInstrLen; // Current instruction lenght in UCHARs
UCHAR bOpcode; // Current opcode that is being disassembled
UCHAR bSegOverride; // 0 default segment. >0, segment index
UCHAR bMod=0; // Mod field of the instruction
UCHAR bReg=0; // Register field of the instruction
UCHAR bRm=0; // R/M field of the instruction
UCHAR bW; // Width bit for the register selection
UCHAR bSib; // S-I-B UCHAR for the instruction
UCHAR bSs; // SS field of the s-i-b UCHAR
UCHAR bIndex; // Index field of the s-i-b UCHAR
UCHAR bBase; // Base field of the s-i-b UCHAR
LPSTR pSymbolName; // used to symbolic name of value
bInstrLen = 0; // Reset instruction lenght to zero
bSegOverride = 0; // Set default segment (no override)
nPos = 0; // Reset printing position
sPtr = NULL; // Points to no message by default
bpTarget = pDis->bpTarget; // Set internal pointer to a target address
bpCode = pDis->Codes; // Set internal pointer to code UCHARs
do
{
bOpcode = NEXTUCHAR; // Get the first opcode UCHAR from the target address
p = &Op1[bOpcode]; // Get the address of the instruction record
if( p->flags & DIS_SPECIAL )
{
// Opcode is one of the special ones, so do what needs to be done there
switch( p->name )
{
case _EscD8:
case _EscD9:
case _EscDA:
case _EscDB:
case _EscDC:
case _EscDD:
case _EscDE:
case _EscDF: // Coprocessor escape: UCHARs D8 - DF
bOpcode = NEXTUCHAR; // Get the modRM UCHAR of the instruction
if( bOpcode < 0xC0 )
{
// Opcodes 00-BF use Coproc1 table
bReg = (bOpcode >> 3) & 7;
p = &Coproc1[ p->name - _EscD8 ][ bReg ];
goto StartInstructionParseMODRM;
}
// Opcodes C0-FF use Coproc2 table
p = &Coproc2[ p->name - _EscD8 ][ bOpcode - 0xC0 ];
goto StartInstructionNoMODRM;
case _S_ES: // Segment override
case _S_CS:
case _S_SS:
case _S_DS:
case _S_FS:
case _S_GS:
bSegOverride = p->name - _S_ES + 1;
continue;
case _OPSIZ: // Operand size override - toggle
pDis->dwFlags ^= DIS_DATA32;
continue;
case _ADSIZ: // Address size override - toggle
pDis->dwFlags ^= DIS_ADDRESS32;
continue;
case _REPNE: // REPNE/REPNZ prefix
pDis->dwFlags |= DIS_REPNE;
continue;
case _REP: // REP/REPE/REPZ prefix
pDis->dwFlags |= DIS_REP;
continue;
case _2BESC: // 2 UCHAR escape code 0x0F
bOpcode = NEXTUCHAR; // Get the second UCHAR of the instruction
p = &Op2[bOpcode]; // Get the address of the instruction record
if( !(p->flags & DIS_SPECIAL) ) goto StartInstruction;
if( p->name < _GRP6 ) goto IllegalOpcode;
case _GRP1a: // Additional groups of instructions
case _GRP1b:
case _GRP1c:
case _GRP2a:
case _GRP2b:
case _GRP2c:
case _GRP2d:
case _GRP2e:
case _GRP2f:
case _GRP3a:
case _GRP3b:
case _GRP4:
case _GRP5:
case _GRP6:
case _GRP7:
case _GRP8:
case _GRP9:
bOpcode = NEXTUCHAR; // Get the Mod R/M UCHAR whose...
// bits 3,4,5 select instruction
bReg = (bOpcode >> 3) & 7;
p = &Groups[p->name - _GRP1a][ bReg ];
if( !(p->flags & DIS_SPECIAL) ) goto StartInstructionParseMODRM;
case _NDEF : // Not defined or illegal opcode
goto IllegalOpcode;
default :; // Should not happen
}
}
else
goto StartInstruction;
}
while( bInstrLen < 15 );
IllegalOpcode:
nPos += PICE_sprintf( pDis->szDisasm+nPos, "invalid");
pDis->dwFlags |= DIS_ILLEGALOP;
goto DisEnd;
StartInstruction:
// If this instruction needs additional Mod R/M UCHAR, fetch it
if( p->flags & DIS_MODRM )
{
// Get the next UCHAR (modR/M bit field)
bOpcode = NEXTUCHAR;
bReg = (bOpcode >> 3) & 7;
StartInstructionParseMODRM:
// Parse that UCHAR and get mod, reg and rm fields
bMod = bOpcode >> 6;
bRm = bOpcode & 7;
}
StartInstructionNoMODRM:
// Print the possible repeat prefix followed by the instruction
if( p->flags & DIS_COPROC )
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%-6s ", sCoprocNames[ p->name ]);
else
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s%-6s ",
sRep[DIS_GETREPENUM(pDis->dwFlags)],
sNames[ p->name + (DIS_GETNAMEFLAG(p->flags) & DIS_GETDATASIZE(pDis->dwFlags)) ] );
// Do instruction argument processing, up to 3 times
pArg = &p->dest;
for( arg=p->args; arg!=0; arg--, pArg++, arg? nPos += PICE_sprintf( pDis->szDisasm+nPos,", ") : 0 )
{
switch( *pArg )
{
case _Eb : // modR/M used - bW = 0
bW = 0;
goto _E;
case _Ev : // modR/M used - bW = 1
bW = 1;
goto _E;
case _Ew : // always USHORT size
pDis->dwFlags &= ~DIS_DATA32;
bW = 1;
goto _E;
case _Ms : // fword ptr (sgdt,sidt,lgdt,lidt)
sPtr = sFwordPtr;
goto _E1;
case _Mq : // qword ptr (cmpxchg8b)
sPtr = sQwordPtr;
goto _E1;
case _Mp : // 32 or 48 bit pointer (les,lds,lfs,lss,lgs)
case _Ep : // Always a memory pointer (call, jmp)
if( pDis->dwFlags & DIS_DATA32 )
sPtr = sFwordPtr;
else
sPtr = sDwordPtr;
goto _E1;
_E:
// Do registers first so that the rest may be done together
if( bMod == 3 )
{
// Registers depending on the w field and data size
nPos+=PICE_sprintf(pDis->szDisasm+nPos, "%s", sRegs1[DIS_GETDATASIZE(pDis->dwFlags)][bW][bRm] );
break;
}
if( bW==0 )
sPtr = sBytePtr;
else
if( pDis->dwFlags & DIS_DATA32 )
sPtr = sDwordPtr;
else
sPtr = sWordPtr;
case _M : // Pure memory pointer (lea,invlpg,floats)
if( bMod == 3 ) goto IllegalOpcode;
_E1:
if( sPtr )
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sPtr );
case _Ma : // Used by bound instruction, skip the pointer info
// Print the segment if it is overriden
//
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s", sSegOverride[ bSegOverride ] );
//
// Special case when sib UCHAR is present in 32 address encoding
//
if( (bRm==4) && (pDis->dwFlags & DIS_ADDRESS32) )
{
//
// Get the s-i-b UCHAR and parse it
//
bSib = NEXTUCHAR;
bSs = bSib >> 6;
bIndex = (bSib >> 3) & 7;
bBase = bSib & 7;
// Special case for base=5 && mod==0 -> fetch 32 bit offset
if( (bBase==5) && (bMod==0) )
{
dwULONG = NEXTULONG;
if(ScanExportsByAddress(&pSymbolName,dwULONG))
{
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%s", pSymbolName );
}
else
{
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%08X", (unsigned int) dwULONG );
}
}
else
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%s", sGenReg16_32[ 1 ][ bBase ] );
// Scaled index, no index if bIndex is 4
if( bIndex != 4 )
nPos += PICE_sprintf( pDis->szDisasm+nPos,"+%s%s", sScale[ bSs ], sGenReg16_32[ 1 ][ bIndex ] );
else
if(bSs != 0)
nPos += PICE_sprintf( pDis->szDisasm+nPos,"<INVALID MODE>" );
// Offset 8 bit or 32 bit
if( bMod == 1 )
{
bUCHAR = NEXTUCHAR;
if( (signed char)bUCHAR < 0 )
nPos += PICE_sprintf( pDis->szDisasm+nPos,"-%02X", 0-(signed char)bUCHAR );
else
nPos += PICE_sprintf( pDis->szDisasm+nPos,"+%02X", bUCHAR );
}
if( bMod == 2 )
{
dwULONG = NEXTULONG;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"+%08X", (unsigned int) dwULONG );
}
// Wrap up the instruction
nPos += PICE_sprintf( pDis->szDisasm+nPos,"]" );
break;
}
//
// 16 or 32 address bit cases with mod zero, one or two
//
// Special cases when r/m is 5 and mod is 0, immediate d16 or d32
if( bMod==0 && ((bRm==6 && !(pDis->dwFlags & DIS_ADDRESS32)) || (bRm==5 && (pDis->dwFlags & DIS_ADDRESS32))) )
{
if( pDis->dwFlags & DIS_ADDRESS32 )
{
dwULONG = NEXTULONG;
if(ScanExportsByAddress(&pSymbolName,dwULONG))
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%s]", pSymbolName );
else
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%08X]", (unsigned int) dwULONG );
}
else
{
wUSHORT = NEXTUSHORT;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%04X]", wUSHORT );
}
break;
}
// Print the start of the line
nPos += PICE_sprintf( pDis->szDisasm+nPos,"[%s", sAdr1[DIS_GETADDRSIZE(pDis->dwFlags)][ bRm ] );
// Offset (8 or 16) or (8 or 32) bit - 16, 32 bits are unsigned
if( bMod==1 )
{
bUCHAR = NEXTUCHAR;
if( (signed char)bUCHAR < 0 )
nPos += PICE_sprintf( pDis->szDisasm+nPos,"-%02X", 0-(signed char)bUCHAR );
else
nPos += PICE_sprintf( pDis->szDisasm+nPos,"+%02X", bUCHAR );
}
if( bMod==2 )
{
if( pDis->dwFlags & DIS_ADDRESS32 )
{
dwULONG = NEXTULONG;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"+%08X", (unsigned int) dwULONG );
}
else
{
wUSHORT = NEXTUSHORT;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"+%04X", wUSHORT );
}
}
// Wrap up the instruction
nPos += PICE_sprintf( pDis->szDisasm+nPos,"]" );
break;
case _Gb : // general, UCHAR register
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sRegs1[0][0][ bReg ] );
break;
case _Gv : // general, (d)USHORT register
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sGenReg16_32[DIS_GETDATASIZE(pDis->dwFlags)][ bReg ] );
break;
case _Yb : // ES:(E)DI pointer
case _Yv :
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s%s", sSegOverrideDefaultES[ bSegOverride ], sYptr[DIS_GETADDRSIZE(pDis->dwFlags)] );
break;
case _Xb : // DS:(E)SI pointer
case _Xv :
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s%s", sSegOverrideDefaultDS[ bSegOverride ], sXptr[DIS_GETADDRSIZE(pDis->dwFlags)] );
break;
case _Rd : // general register double USHORT
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sGenReg16_32[ 1 ][ bRm ] );
break;
case _Rw : // register USHORT
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sGenReg16_32[ 0 ][ bMod ] );
break;
case _Sw : // segment register
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sSeg[ bReg ] );
break;
case _Cd : // control register
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sControl[ bReg ] );
break;
case _Dd : // debug register
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sDebug[ bReg ] );
break;
case _Td : // test register
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sTest[ bReg ] );
break;
case _Jb : // immediate UCHAR, relative offset
bUCHAR = NEXTUCHAR;
nPos += PICE_sprintf( pDis->szDisasm+nPos, "short %08X", (unsigned int)(pDis->bpTarget + (signed char)bUCHAR + bInstrLen) );
break;
case _Jv : // immediate USHORT or ULONG, relative offset
if( pDis->dwFlags & DIS_DATA32 )
{
dwULONG = NEXTULONG;
if(ScanExportsByAddress(&pSymbolName,(unsigned int)(pDis->bpTarget + (signed long)dwULONG + bInstrLen)))
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", pSymbolName );
else
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%08X", (unsigned int)(pDis->bpTarget + (signed long)dwULONG + bInstrLen) );
}
else
{
wUSHORT = NEXTUSHORT;
if(ScanExportsByAddress(&pSymbolName,(unsigned int)(pDis->bpTarget + (signed short)wUSHORT + bInstrLen)))
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", pSymbolName );
else
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%08X", (unsigned int)(pDis->bpTarget + (signed short)wUSHORT + bInstrLen) );
}
break;
case _O : // Simple USHORT or ULONG offset
if( pDis->dwFlags & DIS_ADDRESS32 ) // depending on the address size
{
dwULONG = NEXTULONG;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s[%08X]", sSegOverride[ bSegOverride ], (unsigned int) dwULONG );
}
else
{
wUSHORT = NEXTUSHORT;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s[%04X]", sSegOverride[ bSegOverride ], wUSHORT );
}
break;
case _Ib : // immediate UCHAR
bUCHAR = NEXTUCHAR;
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%02X", bUCHAR );
break;
case _Iv : // immediate USHORT or ULONG
if( pDis->dwFlags & DIS_DATA32 )
{
dwULONG = NEXTULONG;
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%08X", (unsigned int) dwULONG );
}
else
{
wUSHORT = NEXTUSHORT;
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%04X", wUSHORT );
}
break;
case _Iw : // Immediate USHORT
wUSHORT = NEXTUSHORT;
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%04X", wUSHORT );
break;
case _Ap : // 32 bit or 48 bit pointer (call far, jump far)
if( pDis->dwFlags & DIS_DATA32 )
{
dwULONG = NEXTULONG;
wUSHORT = NEXTUSHORT;
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%04X:%08X", wUSHORT, (unsigned int) dwULONG );
}
else
{
dwULONG = NEXTULONG;
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%08X", (unsigned int) dwULONG );
}
break;
case _1 : // numerical 1
nPos += PICE_sprintf( pDis->szDisasm+nPos,"1" );
break;
case _3 : // numerical 3
nPos += PICE_sprintf( pDis->szDisasm+nPos,"3" );
break;
// Hard coded registers
case _DX: case _AL: case _AH: case _BL: case _BH: case _CL: case _CH:
case _DL: case _DH: case _CS: case _DS: case _ES: case _SS: case _FS:
case _GS:
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s", sRegs2[ *pArg - _DX ] );
break;
case _eAX: case _eBX: case _eCX: case _eDX:
case _eSP: case _eBP: case _eSI: case _eDI:
nPos += PICE_sprintf( pDis->szDisasm+nPos, "%s", sGenReg16_32[DIS_GETDATASIZE(pDis->dwFlags)][ *pArg - _eAX ]);
break;
case _ST: // Coprocessor ST
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s", sST[9] );
break;
case _ST0: // Coprocessor ST(0) - ST(7)
case _ST1:
case _ST2:
case _ST3:
case _ST4:
case _ST5:
case _ST6:
case _ST7:
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s", sST[ *pArg - _ST0 ] );
break;
case _AX: // Coprocessor AX
nPos += PICE_sprintf( pDis->szDisasm+nPos,"%s", sGenReg16_32[0][0] );
break;
}
}
DisEnd:
// Set the returning values and return with the bInstrLen field
pDis->bAsciiLen = (UCHAR) nPos;
pDis->bInstrLen = bInstrLen;
return bInstrLen;
}
/******************************************************************************
* *
* BOOLEAN Disasm(PULONG pOffset,PUCHAR pchDst) *
* *
* entry point for disassembly from other modules *
******************************************************************************/
BOOLEAN Disasm(PULONG pOffset,PUCHAR pchDst)
{
TDisassembler dis;
dis.dwFlags = DIS_DATA32 | DIS_ADDRESS32;
dis.bpTarget = (UCHAR*)*pOffset;
dis.szDisasm = pchDst;
dis.wSel = CurrentCS;
*pOffset += (ULONG)Disassembler( &dis);
return TRUE;
}
@@ -1,159 +0,0 @@
/* Operand and instruction types */
#define OP_REG 0x100 /* register */
#define OP_IMM 0x200 /* immediate value */
#define OP_IND 0x300 /* indirect memory reference */
#define OP_BPTR 0x400 /* BYTE Pointer */
#define OP_WPTR 0x500 /* WORD Pointer */
#define OP_DPTR 0x600 /* DWORD Pointer */
#define OP_UNK 0x900
//#define INS_INVALID 0x00 /* Not a valid instruction */
/* Branch Instruction types */
#define INS_BRANCH 0x01 /* Unconditional branch */
#define INS_COND 0x02 /* Conditional branch */
#define INS_SUB 0x04 /* Jump to subroutine */
#define INS_RET 0x08 /* Return from subroutine */
/* modify ( 'w' ) instructions */
#define INS_ARITH 0x10 /* Arithmetic inst */
#define INS_LOGIC 0x20 /* logical inst */
#define INS_FPU 0x40 /* Floating Point inst */
#define INS_FLAG 0x80 /* Modify flags */
/* misc Instruction Types */
#define INS_MOVE 0x0100
#define INS_ARRAY 0x0200 /* String and XLAT ops */
#define INS_PTR 0x0400 /* Load EA/pointer */
#define INS_STACK 0x1000 /* PUSH, POP, etc */
#define INS_FRAME 0x2000 /* ENTER, LEAVE, etc */
#define INS_SYSTEM 0x4000 /* CPUID, WBINVD, etc */
/* Other info */
#define BIG_ENDIAN_ORDER 0
#define LITTLE_ENDIAN_ORDER 1
struct code { /* size 100 */
unsigned long rva;
unsigned short flags;
char mnemonic[16];
char dest[32];
char src[32];
char aux[32];
int mnemType;
int destType;
int srcType;
int auxType;
};
/* struct used in Init routine */
struct CPU_TYPE{
char vendor;
char model[12];
};
#define cpu_80386 0x01
#define cpu_80486 0x02
#define cpu_PENTIUM 0x04
#define cpu_PENTMMX 0x08
#define cpu_PENTPRO 0x10
#define cpu_PENTIUM2 0x20
#define cpu_PENTIUM3 0x40
#define cpu_PENTIUM4 0x80
#define FLAGS_MODRM 0x00001 //contains mod r/m byte
#define FLAGS_8BIT 0x00002 //force 8-bit arguments
#define FLAGS_16BIT 0x00004 //force 16-bit arguments
#define FLAGS_32BIT 0x00008 //force 32-bit arguments
#define FLAGS_REAL 0x00010 //real mode only
#define FLAGS_PMODE 0x00020 //protected mode only
#define FLAGS_PREFIX 0x00040 //for lock and rep prefix
#define FLAGS_MMX 0x00080 //mmx instruction/registers
#define FLAGS_FPU 0x00100 //fpu instruction/registers
#define FLAGS_CJMP 0x00200 //codeflow - conditional jump
#define FLAGS_JMP 0x00400 //codeflow - jump
#define FLAGS_IJMP 0x00800 //codeflow - indexed jump
#define FLAGS_CALL 0x01000 //codeflow - call
#define FLAGS_ICALL 0x02000 //codeflow - indexed call
#define FLAGS_RET 0x04000 //codeflow - return
#define FLAGS_SEGPREFIX 0x08000 //segment prefix
#define FLAGS_OPERPREFIX 0x10000 //operand prefix
#define FLAGS_ADDRPREFIX 0x20000 //address prefix
#define FLAGS_OMODE16 0x40000 //16-bit operand mode only
#define FLAGS_OMODE32 0x80000 //32-bit operand mode only
enum argtype {
ARG_REG=1,ARG_IMM,ARG_NONE,ARG_MODRM,ARG_REG_AX,
ARG_REG_ES,ARG_REG_CS,ARG_REG_SS,ARG_REG_DS,ARG_REG_FS,ARG_REG_GS,ARG_REG_BX,
ARG_REG_CX,ARG_REG_DX,
ARG_REG_SP,ARG_REG_BP,ARG_REG_SI,ARG_REG_DI,ARG_IMM8,ARG_RELIMM8,ARG_FADDR,ARG_REG_AL,
ARG_MEMLOC,ARG_SREG,ARG_RELIMM,ARG_16REG_DX,ARG_REG_CL,ARG_REG_DL,ARG_REG_BL,ARG_REG_AH,
ARG_REG_CH,ARG_REG_DH,ARG_REG_BH,ARG_MODREG,ARG_CREG,ARG_DREG,ARG_TREG_67,ARG_TREG,
ARG_MREG,ARG_MMXMODRM,ARG_MODRM8,ARG_IMM_1,ARG_MODRM_FPTR,ARG_MODRM_S,ARG_MODRMM512,
ARG_MODRMQ,ARG_MODRM_SREAL,ARG_REG_ST0,ARG_FREG,ARG_MODRM_PTR,ARG_MODRM_WORD,ARG_MODRM_SINT,
ARG_MODRM_EREAL,ARG_MODRM_DREAL,ARG_MODRM_WINT,ARG_MODRM_LINT,ARG_REG_BC,ARG_REG_DE,
ARG_REG_HL,ARG_REG_DE_IND,ARG_REG_HL_IND,ARG_REG_BC_IND,ARG_REG_SP_IND,ARG_REG_A,
ARG_REG_B,ARG_REG_C,ARG_REG_D,ARG_REG_E,ARG_REG_H,ARG_REG_L,ARG_IMM16,ARG_REG_AF,
ARG_REG_AF2,ARG_MEMLOC16,ARG_IMM8_IND,ARG_BIT,ARG_REG_IX,ARG_REG_IX_IND,ARG_REG_IY,
ARG_REG_IY_IND,ARG_REG_C_IND,ARG_REG_I,ARG_REG_R,ARG_IMM16_A,ARG_MODRM16,ARG_SIMM8,
ARG_IMM32,ARG_STRING,ARG_MODRM_BCD,ARG_PSTRING,ARG_DOSSTRING,ARG_CUNICODESTRING,
ARG_PUNICODESTRING,ARG_NONEBYTE,ARG_XREG,ARG_XMMMODRM};
typedef struct x86_inst {
int flags;
int destType, srcType, auxType;
int cpu_type;
int inst_type;
char *mnem;
char *dest, *src, *aux;
} instr;
#define GENREG_8 0x0001
#define GENREG_16 0x0002
#define GENREG_32 0x0004
#define SEGREG 0x0008
#define MMXREG 0x0010
#define SIMDREG 0x0020
#define DEBUGREG 0x0040
#define CONTROLREG 0x0080
#define TESTREG 0x0100
#define NO_REG 0x100
#define DIRECT_REG 0x200
#define NO_BASE 0x400
#define NO_INDEX 0x800
#define DISP8 0x1000
#define DISP32 0x2000
#define HAS_SIB 0x4000
#define HAS_MODRM 0x8000
struct OPERAND { //arg1, arg2, arg3
char * str; //temporary buffer for building arg text
int type; //argument type
int * flag; //pointer to CODE arg flags
char * text; //pointer to CODE arg text
};
struct EA { //effective address [SIB/disp]
int mode, flags;
int mod, rm, reg;
long disp;
char sib[32];
};
struct modRM_byte {
unsigned int mod : 2;
unsigned int reg : 3;
unsigned int rm : 3;
};
struct SIB_byte {
unsigned int scale : 2;
unsigned int index : 3;
unsigned int base : 3;
};
typedef struct x86_table { //Assembly instruction tables
instr *table; //Pointer to table of instruction encodings
char divisor; // number to divide by for look up
char mask; // bit mask for look up
char minlim,maxlim; // limits on min/max entries.
char modrmpos; // modrm byte position plus
} asmtable;
File diff suppressed because it is too large Load Diff
@@ -1,515 +0,0 @@
/******************************************************************************
* *
* Module: disassemblerdefines.h *
* *
* Revision: 1.00 *
* *
* Date: 3/17/2000 *
* *
* Copyright (c) 2000 Goran Devic *
* *
* Author: Goran Devic *
* *
*******************************************************************************
Module Description:
This is a header file containing the disassembler defines that are
used in DisassemblerData.h
*******************************************************************************
* *
* Changes: *
* *
* DATE DESCRIPTION OF CHANGES AUTHOR *
* -------- --------------------------------------------------- ----------- *
* 4/28/2000 Original Goran Devic *
* 11/4/2000 Modified for LinIce Goran Devic *
* -------- --------------------------------------------------- ----------- *
*******************************************************************************
* Important Defines *
******************************************************************************/
#ifndef _DDEF_H_
#define _DDEF_H_
/******************************************************************************
*
* Groups and special codes in place of name index
*
******************************************************************************/
#define _NDEF 0x00 // Udefined/reserved opcode
#define _2BESC 0x01 // 2 byte escape code
#define _S_ES 0x02 // Segment ES override | these defines
#define _S_CS 0x03 // Segment CS override | must have
#define _S_SS 0x04 // Segment SS override | consecutive
#define _S_DS 0x05 // Segment DS override | enumeration
#define _S_FS 0x06 // Segment FS override | numbers.
#define _S_GS 0x07 // Segment GS override |
#define _OPSIZ 0x08 // Operand size override
#define _ADSIZ 0x09 // Address size override
#define _REPNE 0x0A // REPNE/REPNZ prefix
#define _REP 0x0B // REP/REPE/REPZ prefix
#define _EscD8 0x0C // Escape to coprocessor set: prefix D8
#define _EscD9 0x0D // Escape to coprocessor set: prefix D9
#define _EscDA 0x0E // Escape to coprocessor set: prefix DA
#define _EscDB 0x0F // Escape to coprocessor set: prefix DB
#define _EscDC 0x10 // Escape to coprocessor set: prefix DC
#define _EscDD 0x11 // Escape to coprocessor set: prefix DD
#define _EscDE 0x12 // Escape to coprocessor set: prefix DE
#define _EscDF 0x13 // Escape to coprocessor set: prefix DF
#define _GRP1a 0x14 // Group 1a extended opcode
#define _GRP1b 0x15 // Group 1b extended opcode
#define _GRP1c 0x16 // Group 1c extended opcode
#define _GRP2a 0x17 // Group 2a extended opcode
#define _GRP2b 0x18 // Group 2b extended opcode
#define _GRP2c 0x19 // Group 2c extended opcode
#define _GRP2d 0x1A // Group 2d extended opcode
#define _GRP2e 0x1B // Group 2e extended opcode
#define _GRP2f 0x1C // Group 2f extended opcode
#define _GRP3a 0x1D // Group 3a extended opcode
#define _GRP3b 0x1E // Group 3b extended opcode
#define _GRP4 0x1F // Group 4 extended opcode
#define _GRP5 0x20 // Group 5 extended opcode
#define _GRP6 0x21 // Group 6 extended opcode
#define _GRP7 0x22 // Group 7 extended opcode
#define _GRP8 0x23 // Group 8 extended opcode
#define _GRP9 0x24 // Group 9 extended opcode
/******************************************************************************
*
* Addressing modes argument definiton for the opcodes in a table
*
******************************************************************************/
#define _O 0x01
#define _Ib 0x03
#define _Iv 0x04
#define _Iw 0x05
#define _Yb 0x06
#define _Yv 0x07
#define _Xb 0x08
#define _Xv 0x09
#define _Jb 0x0A
#define _Jv 0x0B
#define _Ap 0x0C
#define _1 0x10
#define _3 0x11
#define _DX 0x12
#define _AL 0x13
#define _AH 0x14
#define _BL 0x15
#define _BH 0x16
#define _CL 0x17
#define _CH 0x18
#define _DL 0x19
#define _DH 0x1A
#define _CS 0x1B
#define _DS 0x1C
#define _ES 0x1D
#define _SS 0x1E
#define _FS 0x1F
#define _GS 0x20
#define _eAX 0x21
#define _eCX 0x22
#define _eDX 0x23
#define _eBX 0x24
#define _eSP 0x25
#define _eBP 0x26
#define _eSI 0x27
#define _eDI 0x28
#define _Eb 0x2F
#define _Ev 0x30
#define _Ew 0x31
#define _Ep 0x32
#define _Gb 0x33
#define _Gv 0x34
#define _M 0x35
#define _Ma 0x36
#define _Mp 0x37
#define _Ms 0x38
#define _Mq 0x39
#define _Rd 0x3A
#define _Rw 0x3B
#define _Sw 0x3C
#define _Cd 0x3D
#define _Dd 0x3E
#define _Td 0x3F
#define _ST 0x40
#define _ST0 0x41
#define _ST1 0x42
#define _ST2 0x43
#define _ST3 0x44
#define _ST4 0x45
#define _ST5 0x46
#define _ST6 0x47
#define _ST7 0x48
#define _AX 0x49
/******************************************************************************
*
* Define holding structure for opcode
*
******************************************************************************/
typedef struct
{
UCHAR name; // Index into the opcode name table
UCHAR args; // Number of addressing codes that follow
UCHAR dest; // Destination operand addressing code
UCHAR src; // Source operand addressing code
UCHAR thrid; // Third operand addressing code
UCHAR v_instruction; // Virtual instruction index
UCHAR access; // Instruction data access type
UCHAR flags; // Miscellaneous flags
} TOpcodeData;
// `access' field:
// Data access flags are used with memory access instructions
#define INSTR_READ 0x80 // Faulting instruction reads memory
#define INSTR_WRITE 0x40 // Faulting instruction writes to memory
#define INSTR_READ_WRITE 0x20 // Faulting instruction is read-modify-write
// Low nibble contains the data length code - do not change these values as
// they represent the data width value as well
#define INSTR_BYTE 0x01 // Byte access instruction
#define INSTR_WORD 0x02 // Word access instruction
#define INSTR_WORD_DWORD 0x03 // Word or dword, depending on operand size
#define INSTR_DWORD 0x04 // Dword access instruction
// `flags' field:
// Disassembler flags; bottom 4 bits are used by the scanner flags
#define DIS_SPECIAL 0x80 // Special opcode
#define DIS_NAME_FLAG 0x40 // Name changes
#define DIS_GETNAMEFLAG(flags) (((flags)>>6)&1)
#define DIS_COPROC 0x20 // Coprocessor instruction
#define DIS_MODRM 0x10 // Use additional Mod R/M byte
// Scanner enums: 4 bits wide
#define SCAN_NATIVE 0x0 // Native instruction are default 0
#define SCAN_JUMP 0x1 // Evaluate new path
#define SCAN_COND_JUMP 0x2 // Evaluate both paths
#define SCAN_TERMINATING 0x3 // Terminating instruction needs virtualization
#define SCAN_TERM_PMODE 0x4 // Terminating instruction in protected mode only
#define SCAN_SINGLE_STEP 0x5 // Single-step instruction
// Define values stored in meta pages (bits [7:4])
#define META_NATIVE 0x0 // Native instruction are default 0
#define META_UNDEF 0x1 // Undefined/illegal instruction
#define META_TERMINATING 0x2 // Terminating instruction
#define META_SINGLE_STEP 0x3 // Execute natively single step
/******************************************************************************
* *
* Define opcode values for the main table *
* *
******************************************************************************/
#define _aaa 0x001
#define _aad 0x002
#define _aam 0x003
#define _aas 0x004
#define _adc 0x005
#define _add 0x006
#define _and 0x007
#define _arpl 0x008
#define _bound 0x009
#define _bsf 0x00a
#define _bsr 0x00b
#define _bt 0x00c
#define _btc 0x00d
#define _btr 0x00e
#define _bts 0x00f
#define _call 0x010
#define _cbw 0x011
#define _cwde 0x012
#define _clc 0x013
#define _cld 0x014
#define _cli 0x015
#define _clts 0x016
#define _cmc 0x017
#define _cmp 0x018
#define _cmps 0x019
#define _cmpsb 0x01a
#define _cmpsw 0x01b
#define _cmpsd 0x01c
#define _cwd 0x01d
#define _cdq 0x01e
#define _daa 0x01f
#define _das 0x020
#define _dec 0x021
#define _div 0x022
#define _enter 0x023
#define _hlt 0x024
#define _idiv 0x025
#define _imul 0x026
#define _in 0x027
#define _inc 0x028
#define _ins 0x029
#define _insb 0x02a
#define _insw 0x02b
#define _insd 0x02c
#define _int 0x02d
#define _into 0x02e
#define _iret 0x02f
#define _iretd 0x030
#define _jo 0x031
#define _jno 0x032
#define _jb 0x033
#define _jnb 0x034
#define _jz 0x035
#define _jnz 0x036
#define _jbe 0x037
#define _jnbe 0x038
#define _js 0x039
#define _jns 0x03a
#define _jp 0x03b
#define _jnp 0x03c
#define _jl 0x03d
#define _jnl 0x03e
#define _jle 0x03f
#define _jnle 0x040
#define _jmp 0x041
#define _lahf 0x042
#define _lar 0x043
#define _lea 0x044
#define _leave 0x045
#define _lgdt 0x046
#define _lidt 0x047
#define _lgs 0x048
#define _lss 0x049
#define _lds 0x04a
#define _les 0x04b
#define _lfs 0x04c
#define _lldt 0x04d
#define _lmsw 0x04e
#define _lock 0x04f
#define _lods 0x050
#define _lodsb 0x051
#define _lodsw 0x052
#define _lodsd 0x053
#define _loop 0x054
#define _loope 0x055
#define _loopz 0x056
#define _loopne 0x057
#define _loopnz 0x058
#define _lsl 0x059
#define _ltr 0x05a
#define _mov 0x05b
#define _movs 0x05c
#define _movsb 0x05d
#define _movsw 0x05e
#define _movsd 0x05f
#define _movsx 0x060
#define _movzx 0x061
#define _mul 0x062
#define _neg 0x063
#define _nop 0x064
#define _not 0x065
#define _or 0x066
#define _out 0x067
#define _outs 0x068
#define _outsb 0x069
#define _outsw 0x06a
#define _outsd 0x06b
#define _pop 0x06c
#define _popa 0x06d
#define _popad 0x06e
#define _popf 0x06f
#define _popfd 0x070
#define _push 0x071
#define _pusha 0x072
#define _pushad 0x073
#define _pushf 0x074
#define _pushfd 0x075
#define _rcl 0x076
#define _rcr 0x077
#define _rol 0x078
#define _ror 0x079
#define _rep 0x07a
#define _repe 0x07b
#define _repz 0x07c
#define _repne 0x07d
#define _repnz 0x07e
#define _ret 0x07f
#define _sahf 0x080
#define _sal 0x081
#define _sar 0x082
#define _shl 0x083
#define _shr 0x084
#define _sbb 0x085
#define _scas 0x086
#define _scasb 0x087
#define _scasw 0x088
#define _scasd 0x089
#define _set 0x08a
#define _sgdt 0x08b
#define _sidt 0x08c
#define _shld 0x08d
#define _shrd 0x08e
#define _sldt 0x08f
#define _smsw 0x090
#define _stc 0x091
#define _std 0x092
#define _sti 0x093
#define _stos 0x094
#define _stosb 0x095
#define _stosw 0x096
#define _stosd 0x097
#define _str 0x098
#define _sub 0x099
#define _test 0x09a
#define _verr 0x09b
#define _verw 0x09c
#define _wait 0x09d
#define _xchg 0x09e
#define _xlat 0x09f
#define _xlatb 0x0a0
#define _xor 0x0a1
#define _jcxz 0x0a2
#define _loadall 0x0a3
#define _invd 0x0a4
#define _wbinv 0x0a5
#define _seto 0x0a6
#define _setno 0x0a7
#define _setb 0x0a8
#define _setnb 0x0a9
#define _setz 0x0aa
#define _setnz 0x0ab
#define _setbe 0x0ac
#define _setnbe 0x0ad
#define _sets 0x0ae
#define _setns 0x0af
#define _setp 0x0b0
#define _setnp 0x0b1
#define _setl 0x0b2
#define _setnl 0x0b3
#define _setle 0x0b4
#define _setnle 0x0b5
#define _wrmsr 0x0b6
#define _rdtsc 0x0b7
#define _rdmsr 0x0b8
#define _cpuid 0x0b9
#define _rsm 0x0ba
#define _cmpx 0x0bb
#define _xadd 0x0bc
#define _bswap 0x0bd
#define _invpg 0x0be
#define _cmpx8 0x0bf
#define _jmpf 0x0c0
#define _retf 0x0c1
#define _rdpmc 0x0c2
#define _f2xm1 0x001
#define _fabs 0x002
#define _fadd 0x003
#define _faddp 0x004
#define _fbld 0x005
#define _fbstp 0x006
#define _fchs 0x007
#define _fclex 0x008
#define _fcom 0x009
#define _fcomp 0x00a
#define _fcompp 0x00b
#define _fcos 0x00c
#define _fdecstp 0x00d
#define _fdiv 0x00e
#define _fdivp 0x00f
#define _fdivr 0x010
#define _fdivrp 0x011
#define _ffree 0x012
#define _fiadd 0x013
#define _ficom 0x014
#define _ficomp 0x015
#define _fidiv 0x016
#define _fidivr 0x017
#define _fild 0x018
#define _fimul 0x019
#define _fincstp 0x01a
#define _finit 0x01b
#define _fist 0x01c
#define _fistp 0x01d
#define _fisub 0x01e
#define _fisubr 0x01f
#define _fld 0x020
#define _fld1 0x021
#define _fldcw 0x022
#define _fldenv 0x023
#define _fldl2e 0x024
#define _fldl2t 0x025
#define _fldlg2 0x026
#define _fldln2 0x027
#define _fldpi 0x028
#define _fldz 0x029
#define _fmul 0x02a
#define _fmulp 0x02b
#define _fnop 0x02c
#define _fpatan 0x02d
#define _fprem 0x02e
#define _fprem1 0x02f
#define _fptan 0x030
#define _frndint 0x031
#define _frstor 0x032
#define _fsave 0x033
#define _fscale 0x034
#define _fsin 0x035
#define _fsincos 0x036
#define _fsqrt 0x037
#define _fst 0x038
#define _fstcw 0x039
#define _fstenv 0x03a
#define _fstp 0x03b
#define _fstsw 0x03c
#define _fsub 0x03d
#define _fsubp 0x03e
#define _fsubr 0x03f
#define _fsubrp 0x040
#define _ftst 0x041
#define _fucom 0x042
#define _fucomp 0x043
#define _fucompp 0x044
#define _fxam 0x045
#define _fxch 0x046
#define _fxtract 0x047
#define _fyl2x 0x048
#define _fyl2xp1 0x049
/******************************************************************************
*
* External data and strings
*
******************************************************************************/
extern char* sNames[];
extern char* sCoprocNames[];
extern TOpcodeData Op1[ 256 ];
extern TOpcodeData Op2[ 256 ];
extern TOpcodeData Groups[ 17 ][ 8 ];
extern TOpcodeData Coproc1[ 8 ][ 8 ];
extern TOpcodeData Coproc2[ 8 ][ 16 * 4 ];
extern char *sBytePtr;
extern char *sWordPtr;
extern char *sDwordPtr;
extern char *sFwordPtr;
extern char *sQwordPtr;
extern char *sGenReg16_32[ 2 ][ 8 ];
extern char *sSeg[ 8 ];
extern char *sSegOverride[ 8 ];
extern char *sSegOverrideDefaultES[ 8 ];
extern char *sSegOverrideDefaultDS[ 8 ];
extern char *sScale[ 4 ];
extern char *sAdr1[ 2 ][ 8 ];
extern char *sRegs1[ 2 ][ 2 ][ 8 ];
extern char *sRegs2[];
extern char *sControl[ 8 ];
extern char *sDebug[ 8 ];
extern char *sTest[ 8 ];
extern char *sYptr[ 2 ];
extern char *sXptr[ 2 ];
extern char *sRep[ 4 ];
extern char *sST[ 9 ];
#endif // _DDEF_H_
-142
View File
@@ -1,142 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
GPFault.c
Abstract:
handle general protection faults on x86
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
13-Nov-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
////////////////////////////////////////////////////
// GLOBALS
////
ULONG OldGPFaultHandler = 0;
char tempGP[1024];
////////////////////////////////////////////////////
// FUNCTIONS
////
//*************************************************************************
// NewGPFaultHandler()
//
//*************************************************************************
void HandleGPFault(FRAME* ptr)
{
DPRINT((0,"HandleGPFault(): ptr = %x at eip: %x\n",ptr, ptr->eip));
}
//*************************************************************************
// NewGPFaultHandler()
//
//*************************************************************************
__asm__ ("\n\t \
NewGPFaultHandler:\n\t \
pushfl\n\t \
cli\n\t \
cld\n\t \
pushal\n\t \
pushl %ds\n\t \
\n\t \
// test for v86 mode\n\t \
testl $0x20000,40(%esp)\n\t \
jnz notv86\n\t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
.byte 0x2e\n\t \
jmp *_OldGPFaultHandler\n\t \
notv86:\n\t \
// setup default data selectors\n\t \
movw %ss,%ax\n\t \
movw %ax,%ds\n\t \
\n\t \
// get frame ptr\n\t \
lea 40(%esp),%eax\n\t \
pushl %eax\n\t \
call _HandleGPFault\n\t \
addl $4,%esp\n\t \
\n \t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
// remove error code from stack and replace with reason code\n\t \
movl $" STR(REASON_GP_FAULT) ",(%esp)\n\t \
// call debugger loop\n\t \
jmp NewInt31Handler\n\t \
");
//*************************************************************************
// InstallGPFaultHook()
//
//*************************************************************************
void InstallGPFaultHook(void)
{
ULONG LocalGPFaultHandler;
ENTER_FUNC();
MaskIrqs();
if(!OldGPFaultHandler)
{
__asm__("mov $NewGPFaultHandler,%0"
:"=r" (LocalGPFaultHandler)
:
:"eax");
OldGPFaultHandler=SetGlobalInt(0x0D,(ULONG)LocalGPFaultHandler);
}
UnmaskIrqs();
LEAVE_FUNC();
}
//*************************************************************************
// DeInstallGPFaultHook()
//
//*************************************************************************
void DeInstallGPFaultHook(void)
{
ENTER_FUNC();
MaskIrqs();
if(OldGPFaultHandler)
{
RemoveAllSWBreakpoints(TRUE);
SetGlobalInt(0x0D,(ULONG)OldGPFaultHandler);
OldGPFaultHandler=0;
}
UnmaskIrqs();
LEAVE_FUNC();
}
// EOF
-34
View File
@@ -1,34 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
gpfault.h
Abstract:
HEADER for gpfault.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.
--*/
void InstallGPFaultHook(void);
void DeInstallGPFaultHook(void);
extern ULONG OldGPFaultHandler;
File diff suppressed because it is too large Load Diff
-166
View File
@@ -1,166 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
hardwar.h
Abstract:
HEADER for hardware.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.
--*/
typedef struct tagWindow
{
USHORT y,cy;
USHORT usCurX,usCurY;
BOOLEAN bScrollDisabled;
}WINDOW,*PWINDOW;
// pointer indirection table for output functions
typedef struct _OUTPUT_HANDLERS
{
void (*CopyLineTo) (USHORT dest,USHORT src);
void (*PrintGraf) (ULONG x,ULONG y,UCHAR c);
void (*Flush) (void);
void (*ClrLine) (ULONG line);
void (*InvertLine) (ULONG line);
void (*HatchLine) (ULONG line);
void (*PrintLogo) (BOOLEAN bShow);
void (*PrintCursor) (BOOLEAN bForce);
void (*SaveGraphicsState) (void);
void (*RestoreGraphicsState) (void);
void (*ShowCursor) (void);
void (*HideCursor) (void);
void (*SetForegroundColor) (ECOLORS);
void (*SetBackgroundColor) (ECOLORS);
}OUTPUT_HANDLERS,*POUTPUT_HANDLERS;
// pointer indirection table for input functions
typedef struct _INPUT_HANDLERS
{
UCHAR (*GetKeyPolled) (void);
void (*FlushKeyboardQueue) (void);
}INPUT_HANDLERS,*PINPUT_HANDLERS;
extern OUTPUT_HANDLERS ohandlers;
extern INPUT_HANDLERS ihandlers;
enum
{
REGISTER_WINDOW = 0 ,
DATA_WINDOW ,
SOURCE_WINDOW ,
OUTPUT_WINDOW ,
OUTPUT_WINDOW_UNBUFFERED
};
typedef enum _ETERMINALMODE
{
TERMINAL_MODE_HERCULES_GRAPHICS = 0 ,
TERMINAL_MODE_HERCULES_TEXT,
TERMINAL_MODE_VGA_TEXT,
TERMINAL_MODE_SERIAL,
TERMINAL_MODE_NONE
}ETERMINALMODE;
extern ETERMINALMODE eTerminalMode;
extern WINDOW wWindow[];
extern BOOLEAN bRev;
extern BOOLEAN bGrayed;
extern BOOLEAN bCursorEnabled;
// install and remove handler
BOOLEAN ConsoleInit(void);
void ConsoleShutdown(void);
// OUTPUT handler
void Print(USHORT Window,LPSTR p);
void SetBackgroundColor(ECOLORS c);
void SetForegroundColor(ECOLORS c);
void Clear(USHORT window);
void PutChar(LPSTR p,ULONG x,ULONG y);
void ClrLine(ULONG line);
void ShowCursor(void);
void HideCursor(void);
void EnableScroll(USHORT Window);
void DisableScroll(USHORT Window);
void CopyLineTo(USHORT dest,USHORT src);
void PrintLogo(BOOLEAN bShow);
void PrintCursor(BOOLEAN bForce);
void PrintGraf(ULONG x,ULONG y,UCHAR c);
void ScrollUp(USHORT Window);
void Home(USHORT Window);
void InvertLine(ULONG line);
void FillLine(ULONG line,UCHAR c);
void PrintTemplate(void);
void PrintCaption(void);
void ClrLineToEnd(USHORT Window,ULONG line,ULONG x);
void SuspendPrintRingBuffer(BOOLEAN bSuspend);
void HatchLine(ULONG line);
void SaveGraphicsState(void);
void RestoreGraphicsState(void);
void SetWindowGeometry(PVOID pWindow);
// INPUT handler
UCHAR GetKeyPolled(void);
void FlushKeyboardQueue(void);
BOOLEAN PrintRingBufferOffset(ULONG ulLines,ULONG ulOffset);
BOOLEAN PrintRingBufferHome(ULONG ulLines);
void PrintRingBuffer(ULONG ulLines);
ULONG LinesInRingBuffer(void);
void ReplaceRingBufferCurrent(LPSTR s);
void EmptyRingBuffer(void);
void CheckRingBuffer(void);
BOOLEAN AddToRingBuffer(LPSTR p);
void ResetColor(void);
extern ULONG GLOBAL_SCREEN_WIDTH;
extern ULONG GLOBAL_SCREEN_HEIGHT;
extern ULONG ulOutputLock;
#define Acquire_Output_Lock() \
{ \
save_flags(ulOutputLock); \
cli(); \
}
#define Release_Output_Lock() \
restore_flags(ulOutputLock);
#define NOT_IMPLEMENTED()
extern USHORT usCaptionColor;
#define COLOR_CAPTION usCaptionColor
extern USHORT usCaptionText;
#define COLOR_TEXT usCaptionText
extern USHORT usForegroundColor;
#define COLOR_FOREGROUND usForegroundColor
extern USHORT usBackgroundColor;
#undef COLOR_BACKGROUND
#define COLOR_BACKGROUND usBackgroundColor
extern USHORT usHiLiteColor;
#define COLOR_HILITE usHiLiteColor
-486
View File
@@ -1,486 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
hercules.c
Abstract:
HW dependent draw routines
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
04-Aug-1998: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
#include "charset.h"
#include "logo.h"
////////////////////////////////////////////////////
// PROTOTYPES
////
////////////////////////////////////////////////////
// DEFINES
////
////////////////////////////////////////////////////
// GLOBALS
////
// cursor state
BOOLEAN bRev=FALSE;
// HERCULES graphics adapter stuff
// 43 line graphics mode
UCHAR MGATable43[]={53,45,46, 7,96, 2,91,91, 2, 3, 0, 0, 0, 0, 0, 0};
PUCHAR pVgaOffset[4];
// END of HERCULES graphics adapter stuff
// used for HERCULES graphics mode
WINDOW wWindowHercGraph[4]=
{
{1,3,1,0,FALSE},
{5,6,1,0,FALSE},
{12,19,1,0,FALSE},
{32,12,1,0,FALSE}
};
// used for HERCUELS text and VGA text mode
WINDOW wWindowHerc[4]=
{
{1,3,1,0,FALSE},
{5,4,1,0,FALSE},
{10,9,1,0,FALSE},
{20,4,1,0,FALSE}
};
PUCHAR pScreenBufferHercules;
struct _attr
{
union
{
struct
{
UCHAR fgcol : 4;
UCHAR bkcol : 3;
UCHAR blink : 1;
}bits;
UCHAR Asuchar;
}u;
}attr;
//*************************************************************************
// SetForegroundColorVga()
//
//*************************************************************************
void SetForegroundColorHercules(ECOLORS col)
{
attr.u.bits.fgcol = col;
attr.u.bits.blink = 0;
}
//*************************************************************************
// SetBackgroundColorVga()
//
//*************************************************************************
void SetBackgroundColorHercules(ECOLORS col)
{
attr.u.bits.bkcol = col;
attr.u.bits.blink = 0;
}
//*************************************************************************
// PrintGrafHercules()
//
//*************************************************************************
void PrintGrafHercules(ULONG x,ULONG y,UCHAR c)
{
ULONG i;
PUCHAR p;
ULONG _line = y<<3;
if(!pScreenBufferHercules)
return;
p=&cGraphTable[(ULONG)c<<3];
if((attr.u.bits.bkcol == COLOR_FOREGROUND && attr.u.bits.fgcol == COLOR_BACKGROUND) ||
(attr.u.bits.bkcol == COLOR_CAPTION && attr.u.bits.fgcol == COLOR_TEXT) )
for(i=0 ;i<8 ;i++,_line++)
{
*(PUCHAR)(pVgaOffset[_line & 0x3] + ( 90* (_line >> 2) ) + x) = ~*p++;
}
else
for(i=0 ;i<8 ;i++,_line++)
{
*(PUCHAR)(pVgaOffset[_line & 0x3] + ( 90* (_line >> 2) ) + x) = *p++;
}
}
//*************************************************************************
// FlushHercules()
//
//*************************************************************************
void FlushHercules(void)
{
}
//*************************************************************************
// ShowCursor()
//
// show hardware cursor
//*************************************************************************
void ShowCursorHercules(void)
{
ENTER_FUNC();
bCursorEnabled=TRUE;
LEAVE_FUNC();
}
//*************************************************************************
// HideCursorHercules()
//
// hide hardware cursor
//*************************************************************************
void HideCursorHercules(void)
{
ENTER_FUNC();
bCursorEnabled=FALSE;
LEAVE_FUNC();
}
//*************************************************************************
// CopyLineTo()
//
// copy a line from src to dest
//*************************************************************************
void CopyLineToHercules(USHORT dest,USHORT src)
{
USHORT i,j;
PULONG pDest,pSrc;
ENTER_FUNC();
dest <<= 3;
src <<= 3;
for(i=0;i<8;i++)
{
(PUCHAR)pDest = (PUCHAR)pScreenBufferHercules + ( ( ( dest+i )&3) <<13 )+ 90 * ((dest+i) >> 2);
(PUCHAR)pSrc = (PUCHAR)pScreenBufferHercules + ( ( ( src+i )&3) <<13 )+ 90 * ((src+i) >> 2);
for(j=0;j<(GLOBAL_SCREEN_WIDTH>>2);j++)
{
*pDest++=*pSrc++;
}
}
LEAVE_FUNC();
}
//*************************************************************************
// InvertLineHercules()
//
// invert a line on the screen
//*************************************************************************
void InvertLineHercules(ULONG line)
{
ULONG i,j;
ULONG _line = line<<3;
PUSHORT p;
//ENTER_FUNC();
for(j=0;j<8;j++)
{
p=(PUSHORT)( pVgaOffset[_line&3] + (90*(_line>>2)) );
for(i=0;i<(GLOBAL_SCREEN_WIDTH>>1);i++)
{
p[i]=~p[i];
}
_line++;
}
//LEAVE_FUNC();
}
//*************************************************************************
// HatchLineHercules()
//
// hatches a line on the screen
//*************************************************************************
void HatchLineHercules(ULONG line)
{
USHORT cc;
ULONG i,j;
ULONG _line = (line<<3) ;
PUSHORT p;
USHORT mask_odd[]={0x8888,0x2222};
USHORT mask_even[]={0xaaaa,0x5555};
PUSHORT pmask;
ENTER_FUNC();
pmask = (line&1)?mask_odd:mask_even;
for(j=0;j<8;j++,_line++)
{
p=(PUSHORT)( pVgaOffset[_line&3] + (90*(_line>>2)) );
for(i=0;i<(GLOBAL_SCREEN_WIDTH/sizeof(USHORT));i++)
{
cc = p[i];
p[i]=(p[i]^pmask[j&1])|cc;
}
}
LEAVE_FUNC();
}
//*************************************************************************
// ClrLineHercules()
//
// clear a line on the screen
//*************************************************************************
void ClrLineHercules(ULONG line)
{
ULONG j;
BOOLEAN bTemplateLine=( (USHORT)line==wWindow[DATA_WINDOW].y-1 ||
(USHORT)line==wWindow[SOURCE_WINDOW].y-1 ||
(USHORT)line==wWindow[OUTPUT_WINDOW].y-1 ||
0);
ULONG _line = line<<3;
ULONG cc=0;
PUCHAR p;
// ENTER_FUNC();
if(line > GLOBAL_SCREEN_HEIGHT )
{
DPRINT((0,"ClrLineHercules(): line %u is out of screen\n",line));
//LEAVE_FUNC();
return;
}
if(attr.u.bits.bkcol == COLOR_CAPTION && attr.u.bits.fgcol == COLOR_TEXT )
cc=~cc;
if(bTemplateLine)
{
for(j=0;j<8;j++,_line++)
{
p = (PUCHAR)(pVgaOffset[_line&3] + (90*(_line>>2)) );
/*
if(j==2 || j==5)cc=0xFF;
else if(j==3)cc=0xaa;
else if(j==4)cc=0x55;
else cc = 0;*/
if(j==2 || j==5)cc=0xFF;
else cc = 0;
PICE_memset(p,(UCHAR)cc,GLOBAL_SCREEN_WIDTH);
}
}
else
{
for(j=0;j<8;j++,_line++)
{
p = (PUCHAR)(pVgaOffset[_line&3] + (90*(_line>>2)) );
PICE_memset(p,(UCHAR)cc,GLOBAL_SCREEN_WIDTH);
}
}
//LEAVE_FUNC();
}
//*************************************************************************
// PrintLogoHercules()
//
//*************************************************************************
void PrintLogoHercules(BOOLEAN bShow)
{
LONG x,y;
PUCHAR p;
p=(PUCHAR)pScreenBufferHercules;
for(y=0;y<24;y++)
{
for(x=0;x<8;x++)
{
p[ ( 0x2000* (( y + 8 ) & 0x3) )+
( 90* ( (y + 8 ) >> 2) )+
(81+x)] = cLogo[y*8+x];
}
}
}
//*************************************************************************
// PrintCursorHercules()
//
// emulate a blinking cursor block
//*************************************************************************
void PrintCursorHercules(BOOLEAN bForce)
{
static ULONG count=0;
if( (bForce) || ((count++>100) && bCursorEnabled) )
{
ULONG i;
ULONG x,y;
ULONG _line;
x=wWindow[OUTPUT_WINDOW].usCurX;
y=wWindow[OUTPUT_WINDOW].y+wWindow[OUTPUT_WINDOW].usCurY;
_line = y<<3;
for(i=0;i<8;i++,_line++)
{
*(PUCHAR)(pVgaOffset[_line & 0x3] + ( 90* (_line >> 2) ) + x) ^= 0xFF ;
}
bRev=!bRev;
count=0;
}
KeStallExecutionProcessor(2500);
}
//*************************************************************************
// SaveGraphicsHercules()
//
//*************************************************************************
void SaveGraphicsStateHercules(void)
{
// not implemented
}
//*************************************************************************
// RestoreGraphicsStateHercules()
//
//*************************************************************************
void RestoreGraphicsStateHercules(void)
{
// not implemented
}
//*************************************************************************
// ConsoleInitHercules()
//
// init terminal screen
//*************************************************************************
BOOLEAN ConsoleInitHercules(void)
{
BOOLEAN bResult = FALSE;
PUCHAR pMGATable = MGATable43;
UCHAR i,reg,data;
PHYSICAL_ADDRESS FrameBuffer;
ENTER_FUNC();
ohandlers.CopyLineTo = CopyLineToHercules;
ohandlers.PrintGraf = PrintGrafHercules;
ohandlers.Flush = FlushHercules;
ohandlers.ClrLine = ClrLineHercules;
ohandlers.InvertLine = InvertLineHercules;
ohandlers.HatchLine = HatchLineHercules;
ohandlers.PrintLogo = PrintLogoHercules;
ohandlers.PrintCursor = PrintCursorHercules;
ohandlers.SaveGraphicsState = SaveGraphicsStateHercules;
ohandlers.RestoreGraphicsState = RestoreGraphicsStateHercules;
ohandlers.ShowCursor = ShowCursorHercules;
ohandlers.HideCursor = HideCursorHercules;
ohandlers.SetForegroundColor = SetForegroundColorHercules;
ohandlers.SetBackgroundColor = SetBackgroundColorHercules;
ihandlers.GetKeyPolled = KeyboardGetKeyPolled;
ihandlers.FlushKeyboardQueue = KeyboardFlushKeyboardQueue;
// init HERCULES adapter
outb_p(0,0x3b8);
outb_p(0x03,0x3bf);
for(i=0;i<sizeof(MGATable43);i++)
{
reg=i;
outb_p(reg,0x3b4);
data=pMGATable[i];
outb_p(data,0x3b5);
}
outb_p(0x0a,0x3b8);
SetWindowGeometry(wWindowHercGraph);
GLOBAL_SCREEN_WIDTH = 90;
GLOBAL_SCREEN_HEIGHT = 45;
attr.u.Asuchar = 0x07;
FrameBuffer.u.LowPart = 0xb0000;
pScreenBufferHercules=MmMapIoSpace(FrameBuffer,FRAMEBUFFER_SIZE,MmNonCached);
DPRINT((0,"VGA memory phys. 0xb0000 mapped to virt. 0x%x\n",pScreenBufferHercules));
if(pScreenBufferHercules)
{
for(i=0;i<4;i++)
{
pVgaOffset[i] = (PUCHAR)pScreenBufferHercules+0x2000*i;
DPRINT((0,"VGA offset %u = 0x%.8X\n",i,pVgaOffset[i]));
}
bResult = TRUE;
PICE_memset(pScreenBufferHercules,0x0,FRAMEBUFFER_SIZE);
EmptyRingBuffer();
DPRINT((0,"ConsoleInitHercules() SUCCESS!\n"));
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// ConsoleShutdownHercules()
//
// exit terminal screen
//*************************************************************************
void ConsoleShutdownHercules(void)
{
ENTER_FUNC();
// HERC video off
outb_p(0,0x3b8);
outb_p(0,0x3bf);
if(pScreenBufferHercules)
MmUnmapIoSpace(pScreenBufferHercules,FRAMEBUFFER_SIZE);
LEAVE_FUNC();
}
-32
View File
@@ -1,32 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
hercules.h
Abstract:
HEADER for hercules.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.
--*/
BOOLEAN ConsoleInitHercules(void);
void ConsoleShutdownHercules(void);
-177
View File
@@ -1,177 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
hooks.c
Abstract:
hooking of interrupts
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
16-Jul-1998: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
////////////////////////////////////////////////////
// PROTOTYPES
////
void DeinstallHooks(void);
////////////////////////////////////////////////////
// DEFINES
////
////////////////////////////////////////////////////
// GLOBALS
////
// IDT entries
//PIDTENTRY pidt[256];
IDTENTRY oldidt[256]={{0},};
IDTENTRY idt_snapshot[256]={{0},};
// processor flag for interrupt suspension
ULONG ulOldFlags;
////////////////////////////////////////////////////
// PROCEDURES
////
//*************************************************************************
// MaskIrqs()
//
//*************************************************************************
void MaskIrqs(void)
{
ENTER_FUNC();
save_flags(ulOldFlags);
cli();
LEAVE_FUNC();
}
//*************************************************************************
// UnmaskIrqs()
//
//*************************************************************************
void UnmaskIrqs(void)
{
ENTER_FUNC();
restore_flags(ulOldFlags);
LEAVE_FUNC();
}
//*************************************************************************
// SetGlobalInt()
//
//*************************************************************************
ULONG SetGlobalInt(ULONG dwInt,ULONG NewIntHandler)
{
ULONG idt[2];
ULONG OldIntHandler;
struct IdtEntry* pidt;
struct IdtEntry oldidt;
ENTER_FUNC();
// get linear location of IDT
__asm__("sidt %0":"=m" (idt));
// get pointer to idte for int 3
pidt=((struct IdtEntry*)((idt[1]<<16)|((idt[0]>>16)&0x0000FFFF)))+dwInt;
oldidt=*pidt;
// set new handler address
pidt->HiOffset=(USHORT)(((ULONG)NewIntHandler)>>16);
pidt->LoOffset=(USHORT)(((ULONG)NewIntHandler)&0x0000FFFF);
DPRINT((0,"new INT(%0.2x) handler = %0.4x:%x\n",dwInt,pidt->SegSel,(pidt->HiOffset<<16)|(pidt->LoOffset&0x0000FFFF)));
OldIntHandler=(oldidt.HiOffset<<16)|(oldidt.LoOffset&0x0000FFFF);
DPRINT((0,"old INT(%0.2x) handler = %0.4x:%x\n",dwInt,pidt->SegSel,OldIntHandler));
LEAVE_FUNC();
return OldIntHandler;
}
//*************************************************************************
// TakeIdtSnapshot()
//
//*************************************************************************
void TakeIdtSnapshot(void)
{
ULONG idt[2],i;
struct IdtEntry* pidt;
__asm__("sidt %0":"=m" (idt));
// get pointer to idte for int 3
pidt=((struct IdtEntry*)((idt[1]<<16)|((idt[0]>>16)&0x0000FFFF)));
for(i=0;i<256;i++)
{
DPRINT((11,"TakeIdtSnapShot(): saving vector %u\n",i));
if(IsRangeValid((ULONG)pidt,sizeof(*pidt)) )
{
DPRINT((11,"TakeIdtSnapShot(): vector %u valid\n",i));
idt_snapshot[i] = *pidt++;
}
}
}
//*************************************************************************
// RestoreIdt()
//
//*************************************************************************
void RestoreIdt(void)
{
ULONG idt[2],i;
struct IdtEntry* pidt;
__asm__("sidt %0":"=m" (idt));
// get pointer to idte for int 3
pidt=((struct IdtEntry*)((idt[1]<<16)|((idt[0]>>16)&0x0000FFFF)));
for(i=0;i<256;i++)
{
DPRINT((11,"TakeIdtSnapShot(): restoring vector %u\n",i));
if(IsRangeValid((ULONG)pidt,sizeof(*pidt)) )
{
DPRINT((11,"TakeIdtSnapShot(): vector %u valid\n",i));
*pidt++ = idt_snapshot[i];
}
}
}
// EOF
-49
View File
@@ -1,49 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
hooks.h
Abstract:
HEADER for hooks.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.
--*/
void DeinstallHooks(void);
//ULONG HookInt(ULONG dwInt,ULONG NewIntHandler);
//void UnhookInt(ULONG dwInt);
void MaskIrqs(void);
void UnmaskIrqs(void);
ULONG SetGlobalInt(ULONG dwInt,ULONG NewIntHandler);
ULONG GetIRQVector(ULONG dwInt);
void TakeIdtSnapshot(void);
void RestoreIdt(void);
// structure of an IDT entry
typedef struct IdtEntry
{
USHORT LoOffset;
USHORT SegSel;
USHORT Flags;
USHORT HiOffset;
}IDTENTRY,*PIDTENTRY;
-379
View File
@@ -1,379 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
init.c
Abstract:
initialisation and cleanup of debugger kernel module
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
25-Jan-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
////////////////////////////////////////////////////
// GLOBALS
ULONG ulDoInitialBreak=1;
char szBootParams[1024]="";
char tempInit[256];
PDIRECTORY_OBJECT *pNameSpaceRoot = NULL;
PDEBUG_MODULE pdebug_module_tail = NULL;
PDEBUG_MODULE pdebug_module_head = NULL;
PMADDRESS_SPACE mm_init_mm;
extern LIST_ENTRY *pModuleListHead;
ULONG KeyboardIRQL;
extern void NewInt31Handler(void);
//*************************************************************************
// InitPICE()
//
//*************************************************************************
BOOLEAN InitPICE(void)
{
ULONG ulHandleScancode=0,ulHandleKbdEvent=0;
ARGS Args;
KIRQL Dirql;
KAFFINITY Affinity;
ULONG ulAddr;
ENTER_FUNC();
DPRINT((0,"InitPICE(): trace step 0.5\n"));
KeyboardIRQL = HalGetInterruptVector(Internal,
0,
0,
KEYBOARD_IRQ,
&Dirql,
&Affinity);
DPRINT((0,"KeyboardIRQL: %x\n", KeyboardIRQL));
DPRINT((0,"InitPICE(): trace step 1\n"));
// enable monochrome passthrough on BX type chipset
EnablePassThrough();
DPRINT((0,"InitPICE(): trace step 2\n"));
// now load all symbol files described in /etc/pice.conf
if(!LoadSymbolsFromConfig(FALSE))
{
DPRINT((0,"InitPICE: LoadSymbolsFromConfig() failed\n"));
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 3\n"));
// init the output console
// this might be one of the following depending setup
// a) monochrome card
// b) serial terminal (TODO)
if(!ConsoleInit())
{
DPRINT((0,"InitPICE: ConsoleInit() failed\n"));
UnloadSymbols();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 4\n"));
// print the initial screen template
PrintTemplate();
/*
DPRINT((0,"InitPICE(): trace step 5\n"));
// ask the user if he wants to abort the debugger load
if(!CheckLoadAbort())
{
Print(OUTPUT_WINDOW,"pICE: ABORT (abort by user)\n");
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
*/
DPRINT((0,"InitPICE(): trace step 6\n"));
// load the file /boot/System.map.
// !!! It must be consistent with the current kernel at all cost!!!
if(!LoadExports())
{
Print(OUTPUT_WINDOW,"pICE: failed to load exports\n");
Print(OUTPUT_WINDOW,"press any key to continue...\n");
while(!GetKeyPolled());
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 7\n"));
ScanExports("_KernelAddressSpace", &ulAddr);
my_init_mm = (PMADDRESS_SPACE) ulAddr;
DPRINT((0,"init_mm %x @ %x\n",&my_init_mm,my_init_mm));
if(!my_init_mm)
{
Print(OUTPUT_WINDOW,"pICE: ABORT (initial memory map not found)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
DbgPrint("pICE: ABORT (initial memory map not found)\n");
DbgPrint("pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 7.1\n"));
ScanExports("_ModuleListHead",&ulAddr);
pModuleListHead = (LIST_ENTRY*)ulAddr;
DPRINT((0,"pModuleListHead @ %X\n",pModuleListHead));
if(!pModuleListHead)
{
Print(OUTPUT_WINDOW,"pICE: ABORT (pModuleListHead not found)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 7.2\n"));
ScanExports("_PsProcessListHead",&ulAddr);
pPsProcessListHead = (LIST_ENTRY*)ulAddr;
DPRINT((0,"pPsProcessListHead @ %X\n",pPsProcessListHead));
if(!pPsProcessListHead)
{
Print(OUTPUT_WINDOW,"pICE: ABORT (PsProcessListHead not found)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 8\n"));
// end of the kernel
/*
ScanExports("_end",(PULONG)&kernel_end);
if(!kernel_end)
{
Print(OUTPUT_WINDOW,"pICE: ABORT (kernel size is unknown)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadExports();
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
*/
DPRINT((0,"InitPICE(): trace step 9\n"));
// the loaded module list
ScanExports("_NameSpaceRoot", &ulAddr);
pNameSpaceRoot = (PDIRECTORY_OBJECT *)ulAddr;
DPRINT((0,"pNameSpaceRoot @ %X\n",pNameSpaceRoot));
if(!pNameSpaceRoot)
{
Print(OUTPUT_WINDOW,"pICE: ABORT (couldn't retreive name space root)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadExports();
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 10\n"));
// setup a linked list for use in module parsing routines.
if(!InitModuleList(&pdebug_module_head, 100))
{
Print(OUTPUT_WINDOW,"pICE: ABORT (couldn't initialize kernel module list)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
FreeModuleList( pdebug_module_head );
while(!GetKeyPolled());
UnloadExports();
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
pdebug_module_tail = pdebug_module_head;
DPRINT((0,"InitPICE(): trace step 11\n"));
// do a sanity check on exports
if(!SanityCheckExports())
{
Print(OUTPUT_WINDOW,"pICE: ABORT (exports are conflicting with kernel symbols)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadExports();
UnloadSymbols();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 12\n"));
DPRINT((0,"InitPICE(): trace step 13\n"));
// patch the keyboard driver
if(!PatchKeyboardDriver())
{
Print(OUTPUT_WINDOW,"pICE: ABORT (couldn't patch keyboard driver)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");
while(!GetKeyPolled());
UnloadSymbols();
UnloadExports();
ConsoleShutdown();
LEAVE_FUNC();
return FALSE;
}
DPRINT((0,"InitPICE(): trace step 14\n"));
// partial init of shadow registers
CurrentCS = GLOBAL_CODE_SEGMENT;
CurrentEIP = (ULONG)RealIsr;
CurrentDS = CurrentSS = GLOBAL_DATA_SEGMENT;
__asm__("\n\t \
mov %%esp,%%eax\n\t \
mov %%eax,_CurrentESP\n\t \
":::"eax");
// display version and symbol information
Ver(NULL);
// disable HW breakpoints
__asm__("\n\t \
xorl %%eax,%%eax\n\t \
mov %%eax,%%dr6\n\t \
mov %%eax,%%dr7\n\t \
mov %%dr0,%%eax\n\t \
mov %%dr1,%%eax\n\t \
mov %%dr2,%%eax\n\t \
mov %%dr3,%%eax"
:::"eax"
);
DPRINT((0,"InitPICE(): trace step 15\n"));
TakeIdtSnapshot();
DPRINT((0,"InitPICE(): trace step 16\n"));
// install all hooks
InstallTraceHook();
InstallGlobalKeyboardHook();
InstallSyscallHook();
InstallInt3Hook();
InstallDblFltHook();
InstallGPFaultHook();
InstallIntEHook();
InstallPrintkHook();
DPRINT((0,"InitPICE(): trace step 16\n"));
if(ulDoInitialBreak)
{
DPRINT((0,"about to do initial break...\n"));
// simulate an initial break
__asm__("\n\t \
pushfl\n\t \
pushl %cs\n\t \
pushl $initialreturnpoint\n\t \
pushl $" STR(REASON_CTRLF) "\n\t \
jmp NewInt31Handler\n\t \
initialreturnpoint:");
}
else
{
// display register contents
DisplayRegs();
// display data window
Args.Value[0]=CurrentDS;
Args.Value[1]=CurrentEIP;
Args.Count=2;
DisplayMemory(&Args);
// disassembly from current address
Args.Value[0]=CurrentCS;
Args.Value[1]=CurrentEIP;
Args.Count=2;
Unassemble(&Args);
}
DPRINT((0,"InitPICE(): trace step 17\n"));
InitPiceRunningTimer();
LEAVE_FUNC();
return TRUE;
}
//*************************************************************************
// CleanUpPICE()
//
//*************************************************************************
void CleanUpPICE(void)
{
DPRINT((0,"CleanUpPICE(): trace step 1\n"));
RemovePiceRunningTimer();
DPRINT((0,"CleanUpPICE(): trace step 2\n"));
// de-install all hooks
DeInstallGlobalKeyboardHook();
DeInstallSyscallHook();
DeInstallInt3Hook();
DeInstallPrintkHook();
DeInstallDblFltHook();
DeInstallGPFaultHook();
DeInstallIntEHook();
DeInstallTraceHook();
DPRINT((0,"CleanUpPICE(): trace step 3\n"));
RestoreIdt();
DPRINT((0,"CleanUpPICE(): trace step 4\n"));
UnloadExports(); // don't use ScanExports() after this
UnloadSymbols();
DPRINT((0,"CleanUpPICE(): trace step 5\n"));
// restore patch of keyboard driver
RestoreKeyboardDriver();
DPRINT((0,"CleanUpPICE(): trace step 6\n"));
Print(OUTPUT_WINDOW,"pICE: shutting down...\n");
DPRINT((0,"CleanUpPICE(): trace step 7\n"));
// cleanup the console
ConsoleShutdown();
}
-35
View File
@@ -1,35 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
init.h
Abstract:
HEADER for init.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.
--*/
BOOLEAN InitPICE(void);
void CleanUpPICE(void);
extern char szBootParams[1024];
-38
View File
@@ -1,38 +0,0 @@
// start of
// structure of symbol file
///////////////////////////////////////////////////
typedef struct tagLoaderSymbolHeader
{
ULONG dwMagic,dwSize;
char Copyright[256];
char ModuleName[256];
ULONG NumberOfSymbols;
ULONG Reserved; // for future extension
}LOADERSYMBOLHEADER,*PLOADERSYMBOLHEADER;
typedef struct tagLoaderSymbolRecord
{
ULONG ModuleNameLength;
ULONG NameLength;
ULONG Address;
ULONG Type;
ULONG Class;
}LOADERSYMBOLRECORD,*PLOADERSYMBOLRECORD;
typedef struct tagLoaderSymbolFile
{
LOADERSYMBOLHEADER LoaderSymbolHeader; // file header
LOADERSYMBOLRECORD LoaderSymbolRecord[1]; // symbol records (symbol + source file)
}LOADERSYMBOLFILE,*PLOADERSYMBOLFILE;
typedef struct tagLoaderSymbolPool
{
ULONG NumberOfFiles;
ULONG SizeOfThisHeap;
LOADERSYMBOLHEADER LoaderSymbolHeader; // file header
LOADERSYMBOLRECORD LoaderSymbolRecord[1]; // symbol records (symbol + source file)
}LOADERSYMBOLPOOL,*PLOADERSYMBOLPOOL;
// end of
// structure of symbol file
///////////////////////////////////////////////////
-100
View File
@@ -1,100 +0,0 @@
// this file is dynamically generated: DON'T TOUCH
UCHAR cLogo[96]={
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0xab,
0xeb,
0xfb,
0xaf,
0xbf,
0xbf,
0xab,
0xab,
0x81,
0xe0,
0x78,
0x37,
0x9c,
0x1c,
0x03,
0x01,
0x88,
0xe2,
0x3c,
0x63,
0x9e,
0x3f,
0x8f,
0x1f,
0x9c,
0x67,
0x1c,
0x71,
0x1c,
0x1f,
0x1f,
0x1f,
0x98,
0xe2,
0x3c,
0x73,
0x3c,
0x9f,
0x9f,
0x03,
0x81,
0xe0,
0x7c,
0x71,
0x3d,
0xdf,
0x1f,
0x17,
0x83,
0xe0,
0x7c,
0x78,
0x38,
0x0f,
0x9f,
0x3f,
0x9f,
0xe7,
0x3c,
0x7c,
0x70,
0x07,
0x1f,
0x1f,
0x8f,
0xe3,
0x38,
0x38,
0x79,
0xcf,
0x9f,
0x03,
0x9f,
0xe7,
0x18,
0x3c,
0x71,
0xc7,
0x1f,
0x01,
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
0xff,
};
-290
View File
@@ -1,290 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
output.c
Abstract:
catch debugging outputs
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
14-Nov-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
/*
#include <linux/sched.h>
#include <asm/io.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <linux/utsname.h>
#include <linux/sched.h>
#include <linux/console.h>
#include <asm/delay.h>
*/
char tempOutput[1024],tempOutput2[1024];
//ULONG ulPrintk=0;
ULONG (*ulPrintk) (PANSI_STRING String);
BOOLEAN bInPrintk = FALSE;
BOOLEAN bIsDebugPrint = FALSE;
BOOLEAN bIsPrintkPatched = FALSE;
ULONG ulCountTimerEvents = 0;
#ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C"
#else
#define CPP_ASMLINKAGE
#endif
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
asmlinkage int printk(const char *fmt, ...);
//EXPORT_SYMBOL(printk);
//*************************************************************************
// printk()
//
// this function overrides printk() in the kernel
//*************************************************************************
asmlinkage int printk(const char *fmt, ...)
{
ULONG len,ulRingBufferLock;
static LONGLONG ulOldJiffies = 0;
LARGE_INTEGER jiffies;
va_list args;
va_start(args, fmt);
if((len = PICE_strlen((LPSTR)fmt)) )
{
save_flags(ulRingBufferLock);
cli();
PICE_vsprintf(tempOutput, fmt, args);
bIsDebugPrint = TRUE;
// if the last debug print was longer than 50 ms ago
// directly print it, else just add it to the ring buffer
// and let the timer process it.
KeQuerySystemTime(&jiffies);
if( (jiffies.QuadPart-ulOldJiffies) > 10000*(1*wWindow[OUTPUT_WINDOW].cy)/2)
{
ulOldJiffies = jiffies.QuadPart;
Print(OUTPUT_WINDOW,tempOutput);
}
else
{
AddToRingBuffer(tempOutput);
}
bIsDebugPrint = FALSE;
restore_flags(ulRingBufferLock);
}
va_end(args);
return 0;
}
//*************************************************************************
// CountArgs()
//
// count occurrence of '%' in format string (except %%)
// validity of whole format string must have been enforced
//*************************************************************************
ULONG CountArgs(LPSTR fmt)
{
ULONG count=0;
while(*fmt)
{
if(*fmt=='%' && *(fmt+1)!='%')
count++;
fmt++;
}
return count;
}
//***********************************************************************************
// Our replacement of kernel function.
// Must not make any calls to KdpPrintString (e.g. by calling DbgPrint).
//***********************************************************************************
ULONG PICE_KdpPrintString(PANSI_STRING String)
{
ULONG ulRingBufferLock;
save_flags(ulRingBufferLock);
cli();
/* CH: What is bIsDebugPrint used for? */
bIsDebugPrint = FALSE;
DPRINT((0,"PICE_KdpPrintString\n\n\n"));
AddToRingBuffer(String->Buffer);
restore_flags(ulRingBufferLock);
}
//*************************************************************************
// PrintkCallback()
//
// called from RealIsr() when processing INT3 placed
// Must not make any calls to KdpPrintString (e.g. by calling DbgPrint).
//*************************************************************************
void PrintkCallback(void)
{
LPSTR fmt,args;
ULONG ulAddress;
ULONG countArgs,i,len;
PANSI_STRING temp;
CHAR buf[128];
DPRINT((0,"In PrintkCallback\n"));
bInPrintk = TRUE;
// get the linear address of stack where string resides
ulAddress = GetLinearAddress(CurrentSS,CurrentESP);
if(ulAddress)
{
DPRINT((0,"In PrintkCallback: ulAddress: %x\n", ulAddress));
if(IsAddressValid(ulAddress+sizeof(char *)) )
{
//KdpPrintString has PANSI_STRING as a parameter
temp = (PANSI_STRING)*(PULONG)(ulAddress+sizeof(char *));
DPRINT((0,"PrintkCallback: %s\n", temp->Buffer));
/* Call our version of KdpPrintString() */
CurrentEIP = (ULONG_PTR)PICE_KdpPrintString;
}
}
bInPrintk = FALSE;
}
//*************************************************************************
// PiceRunningTimer()
//
//*************************************************************************
KTIMER PiceTimer;
KDPC PiceTimerDPC;
// do I need it here? Have to keep DPC memory resident #pragma code_seg()
VOID PiceRunningTimer(IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2)
{
CheckRingBuffer();
if(ulCountTimerEvents++ > 10)
{
LARGE_INTEGER jiffies;
ulCountTimerEvents = 0;
KeQuerySystemTime(&jiffies);
SetForegroundColor(COLOR_TEXT);
SetBackgroundColor(COLOR_CAPTION);
PICE_sprintf(tempOutput,"jiffies = %.8X\n",jiffies.u.LowPart);
PutChar(tempOutput,GLOBAL_SCREEN_WIDTH-strlen(tempOutput),GLOBAL_SCREEN_HEIGHT-1);
ResetColor();
}
}
//*************************************************************************
// InitPiceRunningTimer()
//
//*************************************************************************
void InitPiceRunningTimer(void)
{
LARGE_INTEGER Interval;
ENTER_FUNC();
#if 0 //won't work. we have to intercept timer interrupt so dpc will never fire while we are in pice
KeInitializeTimer( &PiceTimer );
KeInitializeDpc( &PiceTimerDPC, PiceRunningTimer, NULL );
Interval.QuadPart=-1000000L; // 100 millisec. (unit is 100 nanosec.)
KeSetTimerEx(&PiceTimer,
Interval, 1000000L,
&PiceTimerDpc);
#endif
LEAVE_FUNC();
}
//*************************************************************************
// RemovePiceRunningTimer()
//
//*************************************************************************
void RemovePiceRunningTimer(void)
{
KeCancelTimer( &PiceTimer );
}
//*************************************************************************
// InstallPrintkHook()
//
//*************************************************************************
void InstallPrintkHook(void)
{
ENTER_FUNC();
if( bIsPrintkPatched )
return;
DPRINT((0,"installing PrintString hook\n"));
ScanExports("_KdpPrintString",(PULONG)&ulPrintk);
DPRINT((0,"_KdpPrintString @ %x\n", ulPrintk));
ASSERT( ulPrintk ); // temporary
if(ulPrintk)
{
bIsPrintkPatched = InstallSWBreakpoint(ulPrintk,TRUE,PrintkCallback);
DPRINT((0,"KdpPrintStringTest breakpoint installed? %d\n", bIsPrintkPatched));
}
LEAVE_FUNC();
}
//*************************************************************************
// DeInstallPrintkHook()
//
//*************************************************************************
void DeInstallPrintkHook(void)
{
ENTER_FUNC();
DPRINT((0,"enter DeInstallPrintkHook()\n"));
if(bIsPrintkPatched && ulPrintk)
{
// will be done on exit debugger
if (DeInstallSWBreakpoint(ulPrintk))
bIsPrintkPatched = FALSE;
}
LEAVE_FUNC();
}
-42
View File
@@ -1,42 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
output.h
Abstract:
HEADER for output.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.
--*/
void InstallPrintkHook(void);
void DeInstallPrintkHook(void);
//extern ULONG ulPrintk;
extern ULONG (*ulPrintk) (PANSI_STRING String);
extern BOOLEAN bInPrintk;
extern BOOLEAN bIsDebugPrint;
void InitPiceRunningTimer(void);
void RemovePiceRunningTimer(void);
File diff suppressed because it is too large Load Diff
-182
View File
@@ -1,182 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
parse.h
Abstract:
HEADER for parse.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.
--*/
typedef struct TagArgs
{
ULONG Value[16];
ULONG Count;
UCHAR Switch[16];
ULONG CountSwitches;
BOOLEAN bNotTranslated[16];
LPSTR pToken[16];
}ARGS,*PARGS;
typedef struct tagCPUInfo
{
char *Name;
PULONG pValue;
}CPUINFO;
typedef BOOLEAN (*PFN)(PARGS);
#define MAX_ARGS (5)
typedef struct _CMDTABLE
{
char * Cmd;
PFN Handler;
char * Help;
ULONG Flags;
ULONG ParamFlags[MAX_ARGS];
LPSTR pszRecognizedSwitches;
ULONG CommandGroup;
}CMDTABLE,*PCMDTABLE;
typedef struct tagKeyWords
{
char* KeyWord;
PVOID pValue;
ULONG ulSize;
}KEYWORDS;
typedef struct tagSETGETREGS
{
char *RegName;
PULONG RegAddr;
}SETGETREGS;
typedef struct tag_BP
{
ULONG LinearAddress;
ULONG Segment,Offset;
BOOLEAN Used;
BOOLEAN Active;
BOOLEAN Virtual;
char ModName[256];
char SymName[256];
}BP;
extern BOOLEAN bNeedToFillBuffer;
extern BOOLEAN bCodeOn;
extern BOOLEAN bShowSrc;
extern BP Bp[];
extern BOOLEAN bInt3Here;
extern BOOLEAN bInt1Here;
extern BOOLEAN bStepping;
extern char szCurrentFile[256];
extern PDEBUG_MODULE pCurrentMod;
extern PICE_SYMBOLFILE_HEADER* pCurrentSymbols;
extern LONG ulCurrentlyDisplayedLineNumber;
extern LIST_ENTRY* pPsProcessListHead;
BOOLEAN AsciiToHex(LPSTR p,PULONG pValue);
void Parse(LPSTR pCmdLine,BOOLEAN bInvokedByFkey);
LPSTR FindCommand(LPSTR p);
ULONG StrLenUpToWhiteChar(LPSTR p,LPSTR lpszWhiteChars);
BOOLEAN WaitForKey(void);
BOOLEAN ConvertTokenToHex(LPSTR p,PULONG pValue);
void DisplaySourceFile(LPSTR pSrcLine,LPSTR pSrcEnd,ULONG ulLineNumber,ULONG ulLineNumberToInvert);
BOOLEAN ConvertTokenToSrcFile(LPSTR p,PULONG pValue);
void RepaintDesktop(void);
void PutStatusText(LPSTR p);
void UnassembleOneLineDown(void);
void UnassembleOnePageDown(ULONG page);
void UnassembleOneLineUp(void);
void UnassembleOnePageUp(ULONG page);
extern BOOLEAN (*DisplayMemory)(PARGS pArgs);
#define COMMAND_PROTOTYPE(arg) BOOLEAN arg(PARGS pArgs)
#define COMMAND_RET return TRUE
// available commands
COMMAND_PROTOTYPE(ShowGdt);
COMMAND_PROTOTYPE(LeaveIce);
COMMAND_PROTOTYPE(SingleStep);
COMMAND_PROTOTYPE(ShowHelp);
COMMAND_PROTOTYPE(ShowPageDirs);
COMMAND_PROTOTYPE(ShowProcesses);
COMMAND_PROTOTYPE(DisplayMemoryDword);
COMMAND_PROTOTYPE(DisplayMemoryByte);
COMMAND_PROTOTYPE(DisplayPhysMemDword);
COMMAND_PROTOTYPE(Unassemble);
COMMAND_PROTOTYPE(ShowSymbols);
COMMAND_PROTOTYPE(ShowModules);
COMMAND_PROTOTYPE(SetBreakpoint);
COMMAND_PROTOTYPE(ListBreakpoints);
COMMAND_PROTOTYPE(ClearBreakpoints);
COMMAND_PROTOTYPE(Ver);
COMMAND_PROTOTYPE(Hboot);
COMMAND_PROTOTYPE(I3here);
COMMAND_PROTOTYPE(I1here);
COMMAND_PROTOTYPE(SetSrcDisplay);
COMMAND_PROTOTYPE(ShowIdt);
COMMAND_PROTOTYPE(StepOver);
COMMAND_PROTOTYPE(StepInto);
COMMAND_PROTOTYPE(SetGetRegisters);
COMMAND_PROTOTYPE(SetCodeDisplay);
COMMAND_PROTOTYPE(NextInstr);
COMMAND_PROTOTYPE(ShowCPU);
COMMAND_PROTOTYPE(ShowTables);
COMMAND_PROTOTYPE(WalkStack);
COMMAND_PROTOTYPE(ShowVirtualMemory);
COMMAND_PROTOTYPE(UnassembleAtCurrentEip);
COMMAND_PROTOTYPE(PokeMemory);
COMMAND_PROTOTYPE(PeekMemory);
COMMAND_PROTOTYPE(ShowLocals);
COMMAND_PROTOTYPE(SwitchTables);
COMMAND_PROTOTYPE(SwitchFiles);
COMMAND_PROTOTYPE(EvaluateExpression);
COMMAND_PROTOTYPE(SizeCodeWindow);
COMMAND_PROTOTYPE(SizeDataWindow);
COMMAND_PROTOTYPE(ClearScreen);
COMMAND_PROTOTYPE(ShowMappings);
COMMAND_PROTOTYPE(ShowTimers);
COMMAND_PROTOTYPE(ShowPCI);
COMMAND_PROTOTYPE(SetKeyboardLayout);
COMMAND_PROTOTYPE(ShowSysCallTable);
COMMAND_PROTOTYPE(SetAltKey);
COMMAND_PROTOTYPE(ShowContext);
//ei - make sure the following correspond to ntoskrnl/mm/i386/page.c
//sedwards - Dont use them if you dont need them. Use DDK headers instead.
#define PAGETABLE_MAP (0xf0000000)
#define PAGEDIRECTORY_MAP (0xf0000000 + (PAGETABLE_MAP / (1024)))
//#define PAGE_SHIFT 12
#define PTRS_PER_PTE 1024
//#define PAGE_SIZE (1UL << PAGE_SHIFT)
#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (4 * 1024 * 1024))
#define ADDR_TO_PDE(v) (PULONG)(PAGEDIRECTORY_MAP + \
(((ULONG)v / (1024 * 1024))&(~0x3)))
#define ADDR_TO_PTE(v) (PULONG)(PAGETABLE_MAP + ((((ULONG)v / 1024))&(~0x3)))
#define ADDR_TO_PDE_OFFSET(v) (((ULONG)v / (4 * 1024 * 1024)))
-235
View File
@@ -1,235 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
patch.c
Abstract:
hooking of kernel internal keyboard interrupt handler
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Reactos Port: Eugene Ingerman
Revision History:
10-Jul-1999: created
15-Nov-2000: general cleanup of source files
12/1/2001 reactos port
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
//#include <asm/system.h>
#include <ntddkbd.h>
#include <ntdd8042.h>
#include <rosrtl/string.h>
////////////////////////////////////////////////////
// GLOBALS
////
static PUCHAR pPatchAddress;
static ULONG ulOldOffset = 0;
static ULONG ulKeyPatchFlags;
void (*old_handle_scancode)(UCHAR,int);
char tempPatch[256];
UCHAR ucBreakKey = 'd'; // key that will break into debugger in combination with CTRL
////////////////////////////////////////////////////
// FUNCTIONS
////
//***********************************************************************************
// PiceKbdIsr - keyboard isr hook routine.
// IsrContext - context that we passed to keyboard driver in internal iocontrol
// pCurrentInput, pCurrentOutput - not implemented yet
// StatusByte - keyboard status register
// pByte - pointer to the byte read from keyboard data port. can be changed.
// pContinueProcessing - should keyboard driver continue processing this byte.
//***********************************************************************************
BOOLEAN PiceKbdIsr (
PVOID IsrContext,
PKEYBOARD_INPUT_DATA pCurrentInput,
POUTPUT_PACKET pCurrentOutput,
UCHAR StatusByte,
PUCHAR pByte,
PBOOLEAN pContinueProcessing,
PKEYBOARD_SCAN_STATE pScanState
)
{
static BOOLEAN bControl = FALSE;
BOOLEAN bForward=TRUE; // should we let keyboard driver process this keystroke
BOOLEAN isDown=!(*pByte & 0x80);
UCHAR ucKey = *pByte & 0x7f;
ENTER_FUNC();
// BUG?? should protect with spinlock since bControl is static.
DPRINT((0,"PiceKbdIsr(pByte: %x, val: %x,%u)\n",pByte,*pByte,isDown));
DPRINT((0,"PiceKbdIsr(1): bControl = %u bForward = %u bEnterNow = %u\n",bControl,bForward,bEnterNow));
if(isDown)
{
DPRINT((0,"bControl: %x, ucKey: %x, breakkey: %x\n", bControl, ucKey, AsciiToScan(ucBreakKey)));
// CTRL pressed
if(ucKey==0x1d)
{
bControl=TRUE;
}
else if(bControl==TRUE && ucKey==AsciiToScan(ucBreakKey)) // CTRL-D
{
// fake a CTRL-D release call
bEnterNow=TRUE;
bControl=FALSE;
// simulate an initial break
__asm__("\n\t \
pushfl\n\t \
pushl %cs\n\t \
pushl $returnpoint\n\t \
pushl $" STR(REASON_CTRLF) "\n\t \
jmp NewInt31Handler\n\t \
returnpoint:");
*pByte = 0x1d | 0x80 | 0x7f;
bForward=TRUE;
}
else if((ucKey == 66|| ucKey == 68) && bStepping)
{
bForward=FALSE;
}
}
else
{
// CTRL released
if(ucKey==0x1d)
{
bControl=FALSE;
}
else if((ucKey == 66|| ucKey == 68) && bStepping)
{
bForward=FALSE;
}
}
*pContinueProcessing = bForward;
DPRINT((5,"*pContinueProcessing: %d\n", *pContinueProcessing));
LEAVE_FUNC();
return TRUE;
}
//***********************************************************************************
// PiceSendIoctl - send internal_io_control to the driver
// Target - Device Object that receives control request
// Ioctl - request
// InputBuffer - Type3Buffer will be pointing here
// InputBufferLength - length of inputbuffer
//***********************************************************************************
NTSTATUS PiceSendIoctl(PDEVICE_OBJECT Target, ULONG Ioctl,
PVOID InputBuffer, ULONG InputBufferLength)
{
KEVENT event;
NTSTATUS status = STATUS_SUCCESS;
IO_STATUS_BLOCK iosb;
PIRP irp;
KeInitializeEvent(&event,
NotificationEvent,
FALSE
);
if (NULL == (irp = IoBuildDeviceIoControlRequest(Ioctl,
Target,
InputBuffer,
InputBufferLength,
0,
0,
TRUE,
&event,
&iosb))) {
DPRINT((0,"PiceSendIoctl: STATUS_INSUFFICIENT_RESOURCES\n"));
return STATUS_INSUFFICIENT_RESOURCES;
}
status = IoCallDriver(Target, irp);
if (STATUS_PENDING == status) {
status = KeWaitForSingleObject(&event,
Executive,
KernelMode,
FALSE,
NULL);
ASSERT(STATUS_SUCCESS == status);
status = iosb.Status;
}
DPRINT((0,"PiceSendIoctl: status: %d\n",NT_SUCCESS(status)));
return status;
}
//**************************************************
// PatchKeyboardDriver - set keyboard driver hook.
// We use interface supported by standard keyboard drivers.
//**************************************************
BOOLEAN PatchKeyboardDriver(void)
{
PINTERNAL_I8042_HOOK_KEYBOARD phkData;
//When we have i8042 driver this should be changed!!!!!!!
UNICODE_STRING DevName = ROS_STRING_INITIALIZER(L"\\Device\\Keyboard");
PDEVICE_OBJECT kbdDevice = NULL;
PFILE_OBJECT FO = NULL;
NTSTATUS status;
ENTER_FUNC();
//Get pointer to keyboard device
if( !NT_SUCCESS( status = IoGetDeviceObjectPointer( &DevName, FILE_READ_ACCESS, &FO, &kbdDevice ) ) )
{
DPRINT((0,"PatchKeyboardDriver: IoGetDeviceObjectPointer status: %x\n", status));
return FALSE;
}
phkData = ExAllocatePool( PagedPool, sizeof( INTERNAL_I8042_HOOK_KEYBOARD ) );
RtlZeroMemory( phkData, sizeof( INTERNAL_I8042_HOOK_KEYBOARD ) );
phkData->IsrRoutine = (PI8042_KEYBOARD_ISR) PiceKbdIsr;
phkData->Context = (PVOID) NULL; //DeviceObject;
//call keyboard device internal io control to hook keyboard input stream
status = PiceSendIoctl( kbdDevice, IOCTL_INTERNAL_I8042_HOOK_KEYBOARD,
phkData, sizeof( INTERNAL_I8042_HOOK_KEYBOARD ) );
DPRINT((0,"PatchKeyboardDriver: PiceSendIoctl status: %x\n", status));
ObDereferenceObject(FO);
ExFreePool(phkData);
LEAVE_FUNC();
return NT_SUCCESS(status);
}
void RestoreKeyboardDriver(void)
{
ENTER_FUNC();
DbgPrint("RestoreKeyboardDriver: Not Implemented yet!!!\n");
LEAVE_FUNC();
}
-34
View File
@@ -1,34 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
patch.h
Abstract:
HEADER for patch.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.
--*/
BOOLEAN PatchKeyboardDriver(void);
void RestoreKeyboardDriver(void);
extern UCHAR ucBreakKey;
-905
View File
@@ -1,905 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
pci_ids.h
Abstract:
HEADER, PCI vendor IDs
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.
--*/
struct _PCI_VENDOR_IDS
{
USHORT vendorid;
char* vendor_name;
}PCIVendorIDs[]=
{
{0x0033 ,"PARADYNE CORP."},
{0x003D ,"REAL 3D"},
{0x0100 ,"NCIPHER CORP. LTD"},
{0x0A89 ,"BREA TECHNOLOGIES INC"},
{0x0E11 ,"COMPAQ COMPUTER CORP."},
{0x1000 ,"SYMBIOS LOGIC INC/LSI LOGIC"},
{0x1001 ,"KOLTER ELECTRONIC"},
{0x1002 ,"ATI TECHNOLOGIES INC"},
{0x1004 ,"VLSI TECHNOLOGY INC"},
{0x100B ,"NATIONAL SEMICONDUCTOR CORPORATION"},
{0x1010 ,"VIDEO LOGIC LTD"},
{0x1014 ,"IBM"},
{0x1018 ,"UNISYS CORPORATION"},
{0x1019 ,"ELITEGROUP COMPUTER SYS"},
{0x101A ,"NCR"},
{0x101E ,"AMERICAN MEGATRENDS"},
{0x1020 ,"HITACHI COMPUTER PRODUCTS"},
{0x1021 ,"OKI ELECTRIC INDUSTRY CO. LTD."},
{0x1022 ,"ADVANCED MICRO DEVICES"},
{0x1023 ,"TRIDENT MICROSYSTEMS"},
{0x1028 ,"DELL COMPUTER CORPORATION"},
{0x102A ,"LSI LOGIC CORPORATION"},
{0x102B ,"MATROX GRAPHICS, INC."},
{0x102F ,"TOSHIBA AMERICA, ELEC. COMPANY"},
{0x1033 ,"NEC CORPORATION"},
{0x1038 ,"AMP, INC"},
{0x1039 ,"SILICON INTEGRATED SYSTEMS"},
{0x103C ,"HEWLETT PACKARD"},
{0x103F ,"SYNOPSYS/LOGIC MODELING GROUP"},
{0x1042 ,"MICRON ELECTRONICS, INC."},
{0x1043 ,"ASUSTEK COMPUTER, INC."},
{0x1044 ,"DISTRIBUTED PROCESSING TECHNOLOGY"},
{0x1045 ,"OPTI INC."},
{0x1048 ,"ELSA AG"},
{0x1049 ,"FOUNTAIN TECHNOLOGIES, INC."},
{0x104C ,"TEXAS INSTRUMENTS"},
{0x104D ,"SONY CORPORATION"},
{0x1050 ,"WINBOND ELECTRONICS CORP"},
{0x1054 ,"HITACHI, LTD"},
{0x1055 ,"STANDARD MICROSYSTEMS CORP."},
{0x1057 ,"MOTOROLA"},
{0x1058 ,"ETRI"},
{0x1059 ,"TEKNOR INDUSTRIAL COMPUTERS INC"},
{0x105A ,"PROMISE TECHNOLOGY, INC."},
{0x105B ,"FOXCONN INTERNATIONAL INC"},
{0x105D ,"NUMBER 9 VISUAL TECHNOLOGY"},
{0x105F ,"INFOTRONIC AMERICA INC"},
{0x1063 ,"OCEAN MANUFACTURING LTD"},
{0x1064 ,"ALCATEL"},
{0x1067 ,"MITSUBISHI ELECTRIC AMERICA"},
{0x1068 ,"DIVERSIFIED TECHNOLOGY"},
{0x1069 ,"MYLEX CORPORATION"},
{0x106B ,"APPLE COMPUTER INC."},
{0x106D ,"SEQUENT COMPUTER SYSTEMS"},
{0x1070 ,"DAEWOO TELECOM LTD"},
{0x1071 ,"MITAC"},
{0x1073 ,"YAMAHA CORPORATION"},
{0x1077 ,"QLOGIC"},
{0x1079 ,"I-BUS"},
{0x107B ,"GATEWAY 2000"},
{0x107E ,"INTERPHASE CORPORATION"},
{0x108D ,"OLICOM"},
{0x1095 ,"CMD TECHNOLOGY INC"},
{0x1096 ,"ALACRON"},
{0x1097 ,"APPIAN/ETMA"},
{0x109A ,"PACKARD BELL NEC"},
{0x109E ,"BROOKTREE CORPORATION"},
{0x109F ,"TRIGEM COMPUTER INC."},
{0x10A0 ,"MEIDENSHA CORPORATION"},
{0x10A2 ,"QUANTUM EFFECT DESIGN"},
{0x10A9 ,"SILICON GRAPHICS"},
{0x10AC ,"HONEYWELL IAC"},
{0x10AF ,"MICRO COMPUTER SYSTEMS INC"},
{0x10B5 ,"PLX TECHNOLOGY, INC."},
{0x10B6 ,"MADGE NETWORKS"},
{0x10B7 ,"3COM CORPORATION"},
{0x10B9 ,"ACER LABS INC."},
{0x10BA ,"MITSUBISHI ELECTRIC CORP."},
{0x10C2 ,"AUSPEX SYSTEMS INC."},
{0x10C8 ,"NEOMAGIC CORPORATION"},
{0x10CA ,"FUJITSU MICROELECTRONIC., INC."},
{0x10CB ,"OMRON CORPORATION"},
{0x10CD ,"ADVANCED SYSTEM PRODUCTS, INC"},
{0x10CF ,"FUJITSU LIMITED"},
{0x10D1 ,"FUTUREPLUS SYSTEMS CORP."},
{0x10D2 ,"MOLEX INCORPORATED"},
{0x10DB ,"ROHM LSI SYSTEMS"},
{0x10DD ,"EVANS & SUTHERLAND"},
{0x10DE ,"NVIDIA CORPORATION"},
{0x10DF ,"EMULEX CORPORATION"},
{0x10E1 ,"TEKRAM TECHNOLOGY CO.,LTD."},
{0x10E3 ,"TUNDRA SEMICONDUCTOR CORP."},
{0x10E5 ,"MICRO INDUSTRIES CORPORATION"},
{0x10EC ,"REALTEK SEMICONDUCTOR CORP."},
{0x10EE ,"XILINX, INC."},
{0x10F1 ,"TYAN COMPUTER"},
{0x10F5 ,"NKK CORPORATION"},
{0x10F6 ,"CREATIVE ELECTRONIC SYSTEMS SA"},
{0x10FC ,"I-O DATA DEVICE, INC."},
{0x10FE ,"FAST MULTIMEDIA AG"},
{0x1101 ,"INITIO CORPORATION"},
{0x1102 ,"CREATIVE LABS"},
{0x1105 ,"SIGMA DESIGNS, INC"},
{0x1106 ,"VIA TECHNOLOGIES, INC."},
{0x1107 ,"ASCEND COMMUNICATIONS, INC."},
{0x1109 ,"ADAPTEC/COGENT DATA TECHNOLOGIES INC"},
{0x110A ,"SIEMENS PC SYSTEME GMBH"},
{0x1111 ,"SANTA CRUZ OPERATION"},
{0x1113 ,"ACCTON TECHNOLOGY CORPORATION"},
{0x1116 ,"MEDIA 100, INC"},
{0x1117 ,"DATACUBE, INC"},
{0x1118 ,"FCI ELECTRONICS"},
{0x1119 ,"ICP-VORTEX COMPUTERSYSTEM GMBH"},
{0x111A ,"EFFICIENT NETWORKS, INC"},
{0x111D ,"INTEGRATED DEVICE TECH"},
{0x1120 ,"EMC CORPORATION"},
{0x1127 ,"FORE SYSTEMS INC"},
{0x112A ,"HERMES ELECTRONICS COMPANY, LTD."},
{0x112F ,"IMAGING TECHNOLOGY, INC"},
{0x1131 ,"PHILIPS SEMICONDUCTORS"},
{0x1132 ,"MITEL CORP."},
{0x1133 ,"EICON TECHNOLOGY CORPORATION"},
{0x1134 ,"MERCURY COMPUTER SYSTEMS"},
{0x1135 ,"FUJI XEROX CO LTD"},
{0x1136 ,"MOMENTUM DATA SYSTEMS"},
{0x1137 ,"CISCO SYSTEMS INC"},
{0x1138 ,"ZIATECH CORPORATION"},
{0x113C ,"CYCLONE MICROSYSTEMS, INC."},
{0x113E ,"SANYO ELECTRIC CO - INFORMATION SYSTEMS DIVISION"},
{0x1141 ,"CREST MICROSYSTEM INC."},
{0x1145 ,"WORKBIT CORPORATION"},
{0x1146 ,"FORCE COMPUTERS GMBH"},
{0x1148 ,"SYSKONNECT"},
{0x114C ,"ANNABOOKS"},
{0x114F ,"DIGI INTERNATIONAL"},
{0x1154 ,"MELCO INC"},
{0x115C ,"PHOTRON LTD."},
{0x115D ,"XIRCOM"},
{0x1161 ,"PFU LIMITED"},
{0x1163 ,"RENDITION, A DIVISION OF MICRON"},
{0x1166 ,"RELIANCE COMPUTER"},
{0x116E ,"ELECTRONICS FOR IMAGING"},
{0x1170 ,"INVENTEC CORPORATION"},
{0x1171 ,"BLUE WAVE SYSTEMS"},
{0x1172 ,"ALTERA CORPORATION"},
{0x1179 ,"TOSHIBA AMERICA INFO SYSTEMS"},
{0x1180 ,"RICOH CO LTD"},
{0x1186 ,"D-LINK SYSTEM INC"},
{0x1187 ,"ADVANCED TECHNOLOGY LABORATORIES, INC."},
{0x1189 ,"MATSUSHITA ELECTIC INDUSTRIAL CO LTD"},
{0x118B ,"PLATYPUS TECHNOLOGY PTY LTD"},
{0x118C ,"COROLLARY, INC"},
{0x1191 ,"ACARD TECHNOLOGY CORP"},
{0x1195 ,"RATOC SYSTEMS INC"},
{0x119A ,"MINDSHARE, INC."},
{0x119D ,"BUG, INC."},
{0x119E ,"FUJITSU MICROELECTRONICS LTD."},
{0x119F ,"BULL HN INFORMATION SYSTEMS"},
{0x11A1 ,"HAMAMATSU PHOTONICS K.K."},
{0x11A9 ,"INNOSYS"},
{0x11AA ,"ACTEL"},
{0x11AB ,"GALILEO TECHNOLOGY LTD."},
{0x11AD ,"LITE-ON COMMUNICATIONS INC"},
{0x11AE ,"SCITEX CORPORATION"},
{0x11AF ,"AVID TECHNOLOGY INC"},
{0x11B0 ,"V3 SEMICONDUCTOR INC."},
{0x11B2 ,"EASTMAN KODAK"},
{0x11B3 ,"BARR SYSTEMS INC."},
{0x11BF ,"ASTRODESIGN, INC."},
{0x11C6 ,"DAINIPPON SCREEN MFG. CO. LTD"},
{0x11C8 ,"DOLPHIN INTERCONNECT SOLUTIONS AS"},
{0x11C9 ,"MAGMA"},
{0x11CA ,"LSI SYSTEMS, INC"},
{0x11CB ,"SPECIALIX INTERNATIONAL LTD"},
{0x11CE ,"NETACCESS"},
{0x11D0 ,"LOCKHEED MARTIN - ELECTRONISS & COMMUNICATIONS"},
{0x11D1 ,"AURAVISION"},
{0x11D2 ,"INTERCOM INC."},
{0x11D4 ,"ANALOG DEVICES"},
{0x11D5 ,"IKON CORPORATION"},
{0x11D9 ,"TOSHIBA TEC CORPORATION"},
{0x11DA ,"NOVELL"},
{0x11DF ,"NEW WAVE PDG"},
{0x11E3 ,"QUICKLOGIC CORPORATION"},
{0x11EC ,"CORECO INC"},
{0x11EE ,"DOME IMAGING SYSTEMS INC"},
{0x11F8 ,"PMC-SIERRA INC"},
{0x1203 ,"AGFA CORPORATION"},
{0x1206 ,"AMDAHL CORPORATION"},
{0x120F ,"ESSENTIAL COMMUNICATIONS"},
{0x1214 ,"PERFORMANCE TECHNOLOGIES, INC."},
{0x1216 ,"PURUP - ESKOFOT A/S"},
{0x1217 ,"O2MICRO, INC."},
{0x121A ,"3DFX INTERACTIVE, INC."},
{0x121B ,"VIRATA LTD"},
{0x1221 ,"CONTEC CO., LTD"},
{0x1223 ,"ARTESYN COMMUNICATIONS PRODUCTS INC"},
{0x1227 ,"TECH-SOURCE"},
{0x122C ,"SICAN GMBH"},
{0x1232 ,"MARCONI COMMUNICATIONS LTD"},
{0x123C ,"CENTURY SYSTEMS, INC."},
{0x123D ,"ENGINEERING DESIGN TEAM, INC."},
{0x123F ,"C-CUBE MICROSYSTEMS"},
{0x1242 ,"JAYCOR NETWORKS INC."},
{0x1244 ,"AVM AUDIOVISUELLES MKTG & COMPUTER SYSTEM GMBH"},
{0x124B ,"SBS TECHNOLOGIES"},
{0x1250 ,"HITACHI ULSI SYSTEMS CO LTD"},
{0x1253 ,"GUZIK TECHNICAL ENTERPRISES"},
{0x1255 ,"OPTIBASE LTD"},
{0x1259 ,"ALLIED TELESYN INTERNATIONAL"},
{0x125C ,"AURORA TECHNOLOGIES, INC."},
{0x125F ,"CONCURRENT TECHNOLOGIES"},
{0x1260 ,"INTERSIL CORP"},
{0x1261 ,"MATSUSHITA-KOTOBUKI ELECTRONICS INDUSTRIES, LTD."},
{0x1264 ,"AVAL NAGASAKI CORPORATION"},
{0x1268 ,"TEKTRONIX"},
{0x126C ,"NORTEL NETWORKS"},
{0x126D ,"SPLASH TECHNOLOGY, INC."},
{0x126E ,"SUMITOMO METAL INDUSTRIES, LTD."},
{0x126F ,"SILICON MOTION, INC."},
{0x1270 ,"OLYMPUS OPTICAL CO., LTD."},
{0x1274 ,"CREATIVE LABS, INC. MALVERN"},
{0x1275 ,"NETWORK APPLIANCE CORPORATION"},
{0x1278 ,"TRANSTECH DSP LTD"},
{0x1279 ,"TRANSMETA CORPORATION"},
{0x127D ,"VELA RESEARCH LP"},
{0x127F ,"FUJIFILM"},
{0x1281 ,"YOKOGAWA ELECTRIC CORPORATION"},
{0x1283 ,"INTEGRATED TECHNOLOGY EXPRESS, INC."},
{0x1286 ,"MAZET GMBH"},
{0x128B ,"TRANSWITCH CORPORATION"},
{0x128D ,"G2 NETWORKS, INC."},
{0x128F ,"TATENO DENNOU, INC."},
{0x1290 ,"TOSHIBA PERSONAL COMPUTER SYSTEM CORP."},
{0x1291 ,"NCS COMPUTER ITALIA SRL"},
{0x1292 ,"TRITECH MICROELECTRONICS INC"},
{0x1297 ,"SHUTTLE COMPUTER"},
{0x1299 ,"KNOWLEDGE TECHNOLOGY LAB."},
{0x129A ,"VMETRO, INC."},
{0x129E ,"VICTOR COMPANY OF JAPAN, LTD."},
{0x12A0 ,"ALLEN- BRADLEY COMPANY"},
{0x12A3 ,"LUCENT TECHNOLOGIES"},
{0x12A7 ,"AMO GMBH"},
{0x12A9 ,"XIOTECH CORPORATION"},
{0x12AB ,"YUAN YUAN ENTERPRISE CO., LTD."},
{0x12AE ,"ALTEON WEBSYSTEMS INC"},
{0x12B6 ,"NATURAL MICROSYSTEMS"},
{0x12B7 ,"COGNEX MODULAR VISION SYSTEMS DIV. - ACUMEN INC."},
{0x12B9 ,"3COM CORP."},
{0x12BC ,"ARRAY MICROSYSTEMS"},
{0x12BE ,"ANCHOR CHIPS INC."},
{0x12BF ,"FUJIFILM MICRODEVICES"},
{0x12C0 ,"INFIMED"},
{0x12C3 ,"HOLTEK SEMICONDUCTOR INC"},
{0x12C4 ,"CONNECT TECH INC"},
{0x12C6 ,"MITAN CORPORATION"},
{0x12C7 ,"DIALOGIC CORP"},
{0x12CA ,"INTEGRATED COMPUTING ENGINES"},
{0x12CD ,"AIMS LAB"},
{0x12D3 ,"GE VINGMED ULTRASOUND AS"},
{0x12D4 ,"COMVERSE NETWORKS SYSTEM & ULTICOM, INC."},
{0x12D5 ,"EQUATOR TECHNOLOGIES"},
{0x12D6 ,"ANALOGIC CORP"},
{0x12D8 ,"PERICOM SEMICONDUCTOR"},
{0x12D9 ,"ACULAB PLC"},
{0x12DA ,"TRUE TIME INC."},
{0x12DE ,"RAINBOW TECHNOLOGIES"},
{0x12DF ,"SBS TECHNOLOGIES INC"},
{0x12E0 ,"CHASE RESEARCH"},
{0x12E2 ,"DATUM INC. BANCOMM-TIMING DIVISION"},
{0x12E4 ,"BROOKTROUT TECHNOLOGY INC"},
{0x12E7 ,"SEBRING SYSTEMS, INC"},
{0x12EA ,"REAL VISION, INC"},
{0x12EB ,"AUREAL INC."},
{0x12EC ,"3A INTERNATIONAL, INC."},
{0x12F0 ,"PENTEK"},
{0x12F7 ,"COGNEX INC."},
{0x12FB ,"SPECTRUM SIGNAL PROCESSING"},
{0x12FC ,"CAPITAL EQUIPMENT CORP"},
{0x12FE ,"ESD ELECTRONIC SYSTEM DESIGN GMBH"},
{0x1304 ,"JUNIPER NETWORKS INC."},
{0x1307 ,"COMPUTER BOARDS"},
{0x1308 ,"LEVEL ONE COMMUNICATIONS INC"},
{0x130A ,"MITSUBISHI ELECTRIC MICROCOMPUTER"},
{0x130B ,"COLORGRAPHIC COMMUNICATIONS CORP"},
{0x130F ,"ADVANET INC"},
{0x1310 ,"GESPAC"},
{0x1313 ,"YASKAWA ELECTRIC CO."},
{0x1316 ,"TERADYNE INC."},
{0x1317 ,"ADMTEK INC"},
{0x1318 ,"PACKET ENGINES INC."},
{0x1319 ,"FORTEMEDIA, INC"},
{0x131F ,"SIIG INC"},
{0x1325 ,"SALIX TECHNOLOGIES INC"},
{0x1326 ,"SEACHANGE INTERNATIONAL"},
{0x1331 ,"RADISYS CORP."},
{0x133D ,"PRISA NETWORKS"},
{0x133F ,"SCM MICROSYSTEMS"},
{0x1342 ,"PROMAX SYSTEMS INC"},
{0x1344 ,"MICRON TECHNOLOGY INC"},
{0x134B ,"ARK RESEARCH CORP."},
{0x134C ,"CHORI JOHO SYSTEM CO. LTD"},
{0x134D ,"PC-TEL INC"},
{0x135A ,"BRAIN BOXES LIMITED"},
{0x135C ,"QUATECH INC"},
{0x135E ,"SEALEVEL SYSTEMS INC"},
{0x135F ,"I-DATA INTERNATIONAL A-S"},
{0x1360 ,"MEINBERG FUNKUHREN"},
{0x1361 ,"SOLITON SYSTEMS K.K."},
{0x1363 ,"PHOENIX TECHNOLOGIES LTD"},
{0x1367 ,"HITACHI ZOSEN CORPORATION"},
{0x1368 ,"SKYWARE CORPORATION"},
{0x1369 ,"DIGIGRAM"},
{0x136B ,"KAWASAKI STEEL CORPORATION"},
{0x136C ,"ADTEK SYSTEM SCIENCE CO LTD"},
{0x1375 ,"BOEING - SUNNYVALE"},
{0x1377 ,"ELECTRONIC EQUIPMENT PRODUUTION & DISTRIBUTION GMBH"},
{0x137A ,"MARK OF THE UNICORN INC"},
{0x137B ,"PPT VISION"},
{0x137C ,"IWATSU ELECTRIC CO LTD"},
{0x137D ,"DYNACHIP CORPORATION"},
{0x1380 ,"SANRITZ AUTOMATION CO LTC"},
{0x1381 ,"BRAINS CO. LTD"},
{0x1383 ,"CONTROLNET INC"},
{0x1384 ,"STELLAR SEMICONDUCTOR INC"},
{0x1385 ,"NETGEAR"},
{0x1387 ,"SYSTRAN CORP"},
{0x1388 ,"HITACHI INFORMATION TECHNOLOGY CO LTD"},
{0x1389 ,"APPLICOM INTERNATIONAL"},
{0x138A ,"SITERA"},
{0x138B ,"TOKIMEC INC"},
{0x138E ,"BASLER GMBH"},
{0x138F ,"PATAPSCO DESIGNS INC"},
{0x1393 ,"MOXA TECHNOLOGIES CO LTD"},
{0x1394 ,"LEVEL ONE COMMUNICATIONS"},
{0x1395 ,"AMBICOM INC"},
{0x1396 ,"CIPHER SYSTEMS INC"},
{0x1397 ,"COLOGNE CHIP DESIGNS GMBH"},
{0x1398 ,"CLARION CO. LTD"},
{0x1399 ,"RIOS SYSTEMS CO LTD"},
{0x139A ,"ALACRITECH INC"},
{0x139C ,"QUANTUM 3D INC"},
{0x139D ,"XSTREAMS PLC/ EPL LIMITED"},
{0x139E ,"ECHOSTAR DATA NETWORKS"},
{0x139F ,"AETHRA S.R.L."},
{0x13A0 ,"CRYSTAL GROUP INC"},
{0x13A1 ,"KAWASAKI HEAVY INDUSTRIES LTD"},
{0x13A2 ,"OSITECH COMMUNICATIONS INC"},
{0x13A4 ,"RASCOM INC"},
{0x13A7 ,"TELES AG"},
{0x13A8 ,"EXAR CORP."},
{0x13A9 ,"SIEMENS MEDICAL SYSTEMS, ULTRASOUND GROUP"},
{0x13AA ,"NORTEL NETWORKS - BWA DIVISION"},
{0x13AF ,"T.SQWARE"},
{0x13B1 ,"TAMURA CORPORATION"},
{0x13B4 ,"WELLBEAN CO INC"},
{0x13B5 ,"ARM LTD"},
{0x13B6 ,"DLOG GMBH"},
{0x13B8 ,"NOKIA TELECOMMUNICATIONS OY"},
{0x13BD ,"SHARP CORPORATION"},
{0x13BF ,"SHAREWAVE INC"},
{0x13C1 ,"3WARE INC"},
{0x13C2 ,"TECHNOTREND SYSTEMTECHNIK GMBH"},
{0x13C3 ,"JANZ COMPUTER AG"},
{0x13C6 ,"CONDOR ENGINEERING INC"},
{0x13C7 ,"BLUE CHIP TECHNOLOGY LTD"},
{0x13CA ,"IOMEGA CORPORATION"},
{0x13CC ,"METHEUS CORPORATION"},
{0x13CF ,"STUDIO AUDIO & VIDEO LTD"},
{0x13D0 ,"B2C2, INC"},
{0x13D1 ,"ABOCOM SYSTEMS INC"},
{0x13D2 ,"SHARK MULTIMEDIA INC"},
{0x13D3 ,"IMC NETWORKS"},
{0x13D4 ,"GRAPHICS MICROSYSTEMS INC"},
{0x13D6 ,"K.I. TECHNOLOGY CO LTD"},
{0x13D7 ,"TOSHIBA ENGINEERING CORPORATION"},
{0x13D8 ,"PHOBOS CORPORATION"},
{0x13D9 ,"APEX INC"},
{0x13DC ,"NETBOOST CORPORATION"},
{0x13DE ,"ABB ROBOTICS PRODUCTS AB"},
{0x13DF ,"E-TECH INC"},
{0x13E0 ,"GVC CORPORATION"},
{0x13E3 ,"NEST INC"},
{0x13E4 ,"CALCULEX INC"},
{0x13E5 ,"TELESOFT DESIGN LTD"},
{0x13E9 ,"INTRASERVER TECHNOLOGY INC"},
{0x13EA ,"DALLAS SEMICONDUCTOR"},
{0x13F0 ,"SUNDANCE TECHNOLOGY INC"},
{0x13F1 ,"OCE' - TECHNOLOGIES B.V."},
{0x13F2 ,"FORD MICROELECTRONICS INC"},
{0x13F4 ,"TROIKA NETWORKS INC"},
{0x13F6 ,"C-MEDIA ELECTRONICS INC"},
{0x13F9 ,"NTT ADVANCED TECHNOLOGY CORP."},
{0x13FB ,"AYDIN CORP"},
{0x13FD ,"MICRO SCIENCE INC"},
{0x1400 ,"ARTX INC"},
{0x1402 ,"MEILHAUS ELECTRONIC GMBH"},
{0x1404 ,"FUNDAMENTAL SOFTWARE INC"},
{0x1406 ,"OCE' PRINTING SYSTEMS GMBH"},
{0x1407 ,"LAVA COMPUTER MFG INC"},
{0x1408 ,"ALOKA CO. LTD"},
{0x140A ,"DSP RESEARCH INC"},
{0x140B ,"RAMIX INC"},
{0x140D ,"MATSUSHITA ELECTRIC WORKS LTD"},
{0x1413 ,"ADDONICS"},
{0x1415 ,"OXFORD SEMICONDUCTOR LTD"},
{0x1418 ,"KYUSHU ELECTRONICS SYSTEMS INC"},
{0x1419 ,"EXCEL SWITCHING CORP"},
{0x141B ,"ZOOM TELEPHONICS INC"},
{0x141E ,"FANUC LTD"},
{0x1420 ,"PSION DACOM PLC"},
{0x1428 ,"EDEC CO LTD"},
{0x1429 ,"UNEX TECHNOLOGY CORP."},
{0x142A ,"KINGMAX TECHNOLOGY INC"},
{0x142B ,"RADIOLAN"},
{0x142C ,"MINTON OPTIC INDUSTRY CO LTD"},
{0x142D ,"PIXSTREAM INC"},
{0x1430 ,"ITT AEROSPACE/COMMUNICATIONS DIVISION"},
{0x1433 ,"ELTEC ELEKTRONIK GMBH"},
{0x1436 ,"CIS TECHNOLOGY INC"},
{0x1437 ,"NISSIN INC CO"},
{0x1438 ,"ATMEL-DREAM"},
{0x143F ,"LIGHTWELL CO LTD - ZAX DIVISION"},
{0x1441 ,"AGIE SA."},
{0x1445 ,"LOGICAL CO LTD"},
{0x1446 ,"GRAPHIN CO. LTD"},
{0x1447 ,"AIM GMBH"},
{0x144A ,"ADLINK TECHNOLOGY"},
{0x144B ,"LORONIX INFORMATION SYSTEMS INC"},
{0x144D ,"SAMSUNG ELECTRONICS CO LTD"},
{0x1450 ,"OCTAVE COMMUNICATIONS IND."},
{0x1451 ,"SP3D CHIP DESIGN GMBH"},
{0x1453 ,"MYCOM INC"},
{0x1455 ,"LOGIC PLUS PLUS INC"},
{0x1458 ,"GIGA-BYTE TECHNOLOGY"},
{0x145C ,"CRYPTEK"},
{0x145F ,"BALDOR ELECTRIC COMPANY"},
{0x1460 ,"DYNARC INC"},
{0x1462 ,"MICRO-STAR INTERNATIONAL CO LTD"},
{0x1463 ,"FAST CORPORATION"},
{0x1464 ,"INTERACTIVE CIRCUITS & SYSTEMS LTD"},
{0x1465 ,"GN NETTEST TELECOM DIV."},
{0x1468 ,"AMBIT MICROSYSTEMS CORP."},
{0x1469 ,"CLEVELAND MOTION CONTROLS"},
{0x146C ,"RUBY TECH CORP."},
{0x146D ,"TACHYON, INC."},
{0x146E ,"WILLIAMS ELECTRONICS GAMES, INC."},
{0x1471 ,"INTEGRATED TELECOM EXPRESS INC"},
{0x1473 ,"ZAPEX TECHNOLOGIES INC"},
{0x1474 ,"DOUG CARSON & ASSOCIATES"},
{0x1477 ,"NET INSIGHT"},
{0x1478 ,"DIATREND CORPORATION"},
{0x147B ,"ABIT COMPUTER CORP."},
{0x147F ,"NIHON UNISYS, LTD."},
{0x1482 ,"ISYTEC - INTEGRIERTE SYSTEMTECHNIK GMBH"},
{0x1483 ,"LABWAY COPORATION"},
{0x1485 ,"ERMA - ELECTRONIC GMBH"},
{0x1489 ,"KYE SYSTEMS CORPORATION"},
{0x148A ,"OPTO 22"},
{0x148B ,"INNOMEDIALOGIC INC."},
{0x148E ,"OSI PLUS CORPORATION"},
{0x148F ,"PLANT EQUIPMENT, INC."},
{0x1490 ,"TC LABS PTY LTD."},
{0x1493 ,"MAKER COMMUNICATIONS"},
{0x1495 ,"TOKAI COMMUNICATIONS INDUSTRY CO. LTD"},
{0x1496 ,"JOYTECH COMPUTER CO., LTD."},
{0x1497 ,"SMA REGELSYSTEME GMBH"},
{0x1499 ,"EMTEC CO., LTD"},
{0x149A ,"ANDOR TECHNOLOGY LTD"},
{0x149B ,"SEIKO INSTRUMENTS INC"},
{0x149C ,"OVISLINK CORP."},
{0x149D ,"NEWTEK INC"},
{0x149E ,"MAPLETREE NETWORKS INC."},
{0x149F ,"LECTRON CO LTD"},
{0x14A0 ,"SOFTING GMBH"},
{0x14A1 ,"SYSTEMBASE CO LTD"},
{0x14A2 ,"MILLENNIUM ENGINEERING INC"},
{0x14A3 ,"MAVERICK NETWORKS"},
{0x14A4 ,"GVC/BCM ADVANCED RESEARCH"},
{0x14A5 ,"XIONICS DOCUMENT TECHNOLOGIES INC."},
{0x14A6 ,"INOVA COMPUTERS GMBH & CO KG"},
{0x14A8 ,"FEATRON TECHNOLOGIES CORPORATION"},
{0x14A9 ,"HIVERTEC INC."},
{0x14AB ,"MENTOR GRAPHICS CORP."},
{0x14AC ,"NOVAWEB TECHNOLOGIES INC"},
{0x14AD ,"TIME SPACE RADIO AB"},
{0x14AE ,"CTI PET SYSTEMS, INC"},
{0x14AF ,"GUILLEMOT CORPORATION"},
{0x14B0 ,"BST COMMUNICATION TECHNOLOGY LTD"},
{0x14B1 ,"NEXTCOM K.K."},
{0x14B2 ,"ENNOVATE NETWORKS INC"},
{0x14B3 ,"XPEED INC."},
{0x14B4 ,"PHILIPS BUSINESS ELECTRONICS B.V."},
{0x14B5 ,"CREAMWARE GMBH"},
{0x14B6 ,"QUANTUM DATA CORP."},
{0x14B7 ,"PROXIM INC"},
{0x14B8 ,"TECHSOFT TECHNOLOGY CO LTD"},
{0x14B9 ,"AIRONET WIRELESS COMMUNICATIONS"},
{0x14BA ,"INTERNIX INC."},
{0x14BB ,"SEMTECH CORPORATION"},
{0x14BC ,"GLOBESPAN SEMICONDUCTOR INC."},
{0x14BD ,"CARDIO CONTROL N.V."},
{0x14BE ,"L3 COMMUNICATIONS"},
{0x14BF ,"SPIDER COMMUNICATIONS INC."},
{0x14C0 ,"COMPAL ELECTRONICS INC"},
{0x14C1 ,"MYRICOM INC."},
{0x14C2 ,"DTK COMPUTER"},
{0x14C3 ,"MEDIATEK CORP."},
{0x14C4 ,"IWASAKI INFORMATION SYSTEMS CO LTD"},
{0x14C5 ,"ABB AUTOMATION PRODUCTS AB"},
{0x14C6 ,"DATA RACE INC"},
{0x14C7 ,"MODULAR TECHNOLOY HOLDINGS LTD"},
{0x14C8 ,"TURBOCOMM TECH. INC."},
{0x14C9 ,"ODIN TELESYSTEMS INC"},
{0x14CA ,"PE LOGIC CORP."},
{0x14CB ,"BILLIONTON SYSTEMS INC./CADMUS MICRO INC."},
{0x14CC ,"NAKAYO TELECOMMUNICATIONS INC"},
{0x14CD ,"UNIVERSAL SCIENTIFIC IND."},
{0x14CE ,"WHISTLE COMMUNICATIONS"},
{0x14CF ,"TEK MICROSYSTEMS INC."},
{0x14D0 ,"ERICSSON AXE R & D"},
{0x14D1 ,"COMPUTER HI-TECH CO LTD"},
{0x14D2 ,"TITAN ELECTRONICS INC"},
{0x14D3 ,"CIRTECH (UK) LTD"},
{0x14D4 ,"PANACOM TECHNOLOGY CORP"},
{0x14D5 ,"NITSUKO CORPORATION"},
{0x14D6 ,"ACCUSYS INC"},
{0x14D7 ,"HIRAKAWA HEWTECH CORP"},
{0x14D8 ,"HOPF ELEKTRONIK GMBH"},
{0x14D9 ,"ALPHA PROCESSOR INC"},
{0x14DA ,"NATIONAL AEROSPACE LABORATORIES"},
{0x14DB ,"AVLAB TECHNOLOGY INC"},
{0x14DC ,"AMPLICON LIVELINE LTD"},
{0x14DD ,"IMODL INC."},
{0x14DE ,"APPLIED INTEGRATION CORPORATION"},
{0x14DF ,"BASIS COMMUNICATIONS CORP"},
{0x14E1 ,"INVERTEX"},
{0x14E2 ,"INFOLIBRIA"},
{0x14E3 ,"AMTELCO"},
{0x14E4 ,"BROADCOM CORPORATION"},
{0x14E5 ,"PIXELFUSION LTD"},
{0x14E6 ,"SHINING TECHNOLOGY INC"},
{0x14E7 ,"3CX"},
{0x14E8 ,"RAYCER INC"},
{0x14E9 ,"GARNETS SYSTEM CO LTD"},
{0x14EA ,"PLANEX COMMUNICATIONS INC"},
{0x14EB ,"SEIKO EPSON CORPORATION"},
{0x14EC ,"ACQIRIS"},
{0x14ED ,"DATAKINETICS LTD"},
{0x14EE ,"MASPRO KENKOH CORP"},
{0x14EF ,"CARRY COMPUTER ENG. CO LTD"},
{0x14F0 ,"CANON RESEACH CENTRE FRANCE"},
{0x14F1 ,"CONEXANT"},
{0x14F2 ,"MOBILITY ELECTRONICS"},
{0x14F3 ,"BROADLOGIC"},
{0x14F4 ,"TOKYO ELECTRONIC INDUSTRY CO LTD"},
{0x14F5 ,"SOPAC LTD"},
{0x14F6 ,"COYOTE TECHNOLOGIES LLC"},
{0x14F7 ,"WOLF TECHNOLOGY INC"},
{0x14F8 ,"AUDIOCODES INC"},
{0x14F9 ,"AG COMMUNICATIONS"},
{0x14FA ,"WAVETEK WANDEL & GOLTERMANN"},
{0x14FB ,"TRANSAS MARINE (UK) LTD"},
{0x14FC ,"QUADRICS SUPERCOMPUTERS WORLD"},
{0x14FD ,"JAPAN COMPUTER INDUSTRY INC."},
{0x14FE ,"ARCHTEK TELECOM CORP."},
{0x14FF ,"TWINHEAD INTERNATIONAL CORP."},
{0x1500 ,"LANTECH COMPUTER COMPANY"},
{0x1501 ,"BANKSOFT CANADA LTD"},
{0x1502 ,"MITSUBISHI ELECTRIC LOGISTICS SUPPORT CO LTD"},
{0x1503 ,"KAWASAKI LSI USA INC"},
{0x1504 ,"KAISER ELECTRONICS"},
{0x1505 ,"ITA INGENIEURBURO FUR TESTAUFGABEN GMBH"},
{0x1506 ,"CHAMELEON SYSTEMS INC"},
{0x1507 ,"HTEC LTD"},
{0x1508 ,"HONDA CONNECTORS/MHOTRONICS INC"},
{0x1509 ,"FIRST INTERNATIONAL COMPUTER INC"},
{0x150A ,"FORVUS RESEARCH INC"},
{0x150B ,"YAMASHITA SYSTEMS CORP"},
{0x150C ,"KYOPAL CO LTD"},
{0x150D ,"WARPSPPED INC"},
{0x150E ,"C-PORT CORPORATION"},
{0x150F ,"INTEC GMBH"},
{0x1510 ,"BEHAVIOR TECH COMPUTER CORP"},
{0x1511 ,"CENTILLIUM TECHNOLOGY CORP"},
{0x1512 ,"ROSUN TECHNOLOGIES INC"},
{0x1513 ,"RAYCHEM"},
{0x1514 ,"TFL LAN INC"},
{0x1515 ,"ICS ADVENT"},
{0x1516 ,"MYSON TECHNOLOGY INC"},
{0x1517 ,"ECHOTEK CORPORATION"},
{0x1518 ,"PEP MODULAR COMPUTERS GMBH"},
{0x1519 ,"TELEFON AKTIEBOLAGET LM ERICSSON"},
{0x151A ,"GLOBETEK INC"},
{0x151B ,"COMBOX LTD"},
{0x151C ,"DIGITAL AUDIO LABS INC"},
{0x151D ,"FUJITSU COMPUTER PRODUCTS OF AMERICA"},
{0x151E ,"MATRIX CORP."},
{0x151F ,"TOPIC SEMICONDUCTOR CORP"},
{0x1520 ,"CHAPLET SYSTEM INC"},
{0x1521 ,"BELL CORPORATION"},
{0x1522 ,"MAINPINE LIMITED"},
{0x1523 ,"MUSIC SEMICONDUCTORS"},
{0x1524 ,"ENE TECHNOLOGY INC"},
{0x1525 ,"IMPACT TECHNOLOGIES"},
{0x1526 ,"ISS, INC"},
{0x1527 ,"SOLECTRON"},
{0x1528 ,"ACKSYS"},
{0x1529 ,"AMERICAN MICROSYSTEMS INC"},
{0x152A ,"QUICKTURN DESIGN SYSTEMS"},
{0x152B ,"FLYTECH TECHNOLOGY CO LTD"},
{0x152C ,"MACRAIGOR SYSTEMS LLC"},
{0x152D ,"QUANTA COMPUTER INC"},
{0x152E ,"MELEC INC"},
{0x152F ,"PHILIPS - CRYPTO"},
{0x1530 ,"ACQIS TECHNOLOGY INC"},
{0x1531 ,"CHRYON CORP."},
{0x1532 ,"ECHELON CORPORATION"},
{0x1533 ,"BALTIMORE"},
{0x1534 ,"ROAD CORPORATION"},
{0x1535 ,"EVERGREEN TECHNOLOGIES INC"},
{0x1537 ,"DATALEX COMMUNCATIONS"},
{0x1538 ,"ARALION INC."},
{0x1539 ,"ATELIER INFORMATIQUES ET ELECTRONIQUE ETUDES S.A."},
{0x153A ,"ONO SOKKI"},
{0x153B ,"TERRATEC ELECTRONIC GMBH"},
{0x153C ,"ANTAL ELECTRONIC"},
{0x153D ,"FILANET CORPORATION"},
{0x153E ,"TECHWELL INC"},
{0x153F ,"MIPS DENMARK"},
{0x1540 ,"PROVIDEO MULTIMEDIA CO LTD"},
{0x1541 ,"TELOSITY INC."},
{0x1542 ,"VIVID TECHNOLOGY INC"},
{0x1543 ,"SILICON LABORATORIES"},
{0x1544 ,"DCM DATA SYSTEMS"},
{0x1545 ,"VISIONTEK"},
{0x1546 ,"IOI TECHNOLOGY CORP."},
{0x1547 ,"MITUTOYO CORPORATION"},
{0x1548 ,"JET PROPULSION LABORATORY"},
{0x1549 ,"INTERCONNECT SYSTEMS SOLUTIONS"},
{0x154A ,"MAX TECHNOLOGIES INC."},
{0x154B ,"COMPUTEX CO LTD"},
{0x154C ,"VISUAL TECHNOLOGY INC."},
{0x154D ,"PAN INTERNATIONAL INDUSTRIAL CORP"},
{0x154E ,"SERVOTEST LTD"},
{0x154F ,"STRATABEAM TECHNOLOGY"},
{0x1550 ,"OPEN NETWORK CO LTD"},
{0x1551 ,"SMART ELECTRONIC DEVELOPMENT GMBH"},
{0x1552 ,"RACAL AIRTECH LTD"},
{0x1553 ,"CHICONY ELECTRONICS CO LTD"},
{0x1554 ,"PROLINK MICROSYSTEMS CORP."},
{0x1555 ,"GESYTEC GMBH"},
{0x1556 ,"PLD APPLICATIONS"},
{0x1557 ,"MEDIASTAR CO. LTD"},
{0x1558 ,"CLEVO/KAPOK COMPUTER"},
{0x1559 ,"SI LOGIC LTD"},
{0x155A ,"INNOMEDIA INC"},
{0x155B ,"PROTAC INTERNATIONAL CORP"},
{0x155C ,"CEMAX-ICON INC"},
{0x155D ,"MAC SYSTEM CO LTD"},
{0x155E ,"LP ELEKTRONIK GMBH"},
{0x155F ,"PERLE SYSTEMS LIMITED"},
{0x1560 ,"TERAYON COMMUNICATIONS SYSTEMS"},
{0x1561 ,"VIEWGRAPHICS INC"},
{0x1562 ,"SYMBOL TECHNOLOGIES"},
{0x1563 ,"A-TREND TECHNOLOGY CO LTD"},
{0x1564 ,"YAMAKATSU ELECTRONICS INDUSTRY CO LTD"},
{0x1565 ,"BIOSTAR MICROTECH INT'L CORP"},
{0x1566 ,"ARDENT TECHNOLOGIES INC"},
{0x1567 ,"JUNGSOFT"},
{0x1568 ,"DDK ELECTRONICS INC"},
{0x1569 ,"PALIT MICROSYSTEMS INC"},
{0x156A ,"AVTEC SYSTEMS"},
{0x156B ,"2WIRE, INC"},
{0x156C ,"VIDAC ELECTRONICS GMBH"},
{0x156D ,"ALPHA-TOP CORP"},
{0x156E ,"ALFA INC."},
{0x156F ,"M-SYSTEMS FLASH DISK PIONEERS LTD"},
{0x1570 ,"LECROY CORPORATION"},
{0x1571 ,"CONTEMPORARY CONTROLS"},
{0x1572 ,"OTIS ELEVATOR COMPANY"},
{0x1573 ,"LATTICE - VANTIS"},
{0x1574 ,"FAIRCHILD SEMICONDUCTOR"},
{0x1575 ,"VOLTAIRE ADVANCED DATA SECURITY LTD"},
{0x1576 ,"VIEWCAST COM"},
{0x1578 ,"HITT"},
{0x1579 ,"DUAL TECHNOLOGY CORPORATION"},
{0x157A ,"JAPAN ELECRONICS IND. INC"},
{0x157B ,"STAR MULTIMEDIA CORP."},
{0x157C ,"EUROSOFT (UK) LTD"},
{0x157D ,"GEMFLEX NETWORKS"},
{0x157E ,"TRANSITION NETWORKS"},
{0x157F ,"PX INSTRUMENTS TECHNOLOGY LTD"},
{0x1580 ,"PRIMEX AEROSPACE CO."},
{0x1581 ,"SEH COMPUTERTECHNIK GMBH"},
{0x1582 ,"CYTEC CORPORATION"},
{0x1583 ,"INET TECHNOLOGIES INC"},
{0x1584 ,"UNIWILL COMPUTER CORP."},
{0x1585 ,"LOGITRON"},
{0x1586 ,"LANCAST INC"},
{0x1587 ,"KONICA CORPORATION"},
{0x1588 ,"SOLIDUM SYSTEMS CORP"},
{0x1589 ,"ATLANTEK MICROSYSTEMS PTY LTD"},
{0x158A ,"DIGALOG SYSTEMS INC"},
{0x158B ,"ALLIED DATA TECHNOLOGIES"},
{0x158C ,"HITACHI SEMICONDUCTOR & DEVICES SALES CO LTD"},
{0x158D ,"POINT MULTIMEDIA SYSTEMS"},
{0x158E ,"LARA TECHNOLOGY INC"},
{0x158F ,"DITECT COOP"},
{0x1590 ,"3PARDATA INC."},
{0x1591 ,"ARN"},
{0x1592 ,"SYBA TECH LIMITED"},
{0x1593 ,"BOPS INC"},
{0x1594 ,"NETGAME LTD"},
{0x1595 ,"DIVA SYSTEMS CORP."},
{0x1596 ,"FOLSOM RESEARCH INC"},
{0x1597 ,"MEMEC DESIGN SERVICES"},
{0x1598 ,"GRANITE MICROSYSTEMS"},
{0x1599 ,"DELTA ELECTRONICS INC"},
{0x159A ,"GENERAL INSTRUMENT"},
{0x159B ,"FARADAY TECHNOLOGY CORP"},
{0x159C ,"STRATUS COMPUTER SYSTEMS"},
{0x159D ,"NINGBO HARRISON ELECTRONICS CO LTD"},
{0x159E ,"A-MAX TECHNOLOGY CO LTD"},
{0x159F ,"GALEA NETWORK SECURITY"},
{0x15A0 ,"COMPUMASTER SRL"},
{0x15A1 ,"GEOCAST NETWORK SYSTEMS INC"},
{0x15A2 ,"CATALYST ENTERPRISES INC"},
{0x15A3 ,"ITALTEL"},
{0x15A4 ,"X-NET OY"},
{0x15A5 ,"TOYOTA MACS INC"},
{0x15A6 ,"SUNLIGHT ULTRASOUND TECHNOLOGIES LTD"},
{0x15A7 ,"SSE TELECOM INC"},
{0x15A8 ,"SHANGHAI COMMUNICATIONS TECHNOLOGIES CENTER"},
{0x15AA ,"MORETON BAY"},
{0x15AB ,"BLUESTEEL NETWORKS INC"},
{0x15AC ,"NORTH ATLANTIC INSTRUMENTS"},
{0x15AD ,"VMWARE"},
{0x15AE ,"AMERSHAM PHARMACIA BIOTECH"},
{0x15B0 ,"ZOLTRIX INTERNATIONAL LIMITED"},
{0x15B1 ,"SOURCE TECHNOLOGY INC"},
{0x15B2 ,"MOSAID TECHNOLOGIES INC."},
{0x15B3 ,"MELLANOX TECHNOLOGY"},
{0x15B4 ,"CCI/TRIAD"},
{0x15B5 ,"CIMETRICS INC"},
{0x15B6 ,"TEXAS MEMORY SYSTEMS INC"},
{0x15B7 ,"SANDISK CORP."},
{0x15B8 ,"ADDI-DATA GMBH"},
{0x15B9 ,"MAESTRO DIGITAL COMMUNICATIONS"},
{0x15BA ,"IMPACCT TECHNOLOGY CORP"},
{0x15BB ,"PORTWELL INC"},
{0x15BC ,"AGILENT TECHNOLOGIES"},
{0x15BD ,"DFI INC."},
{0x15BE ,"SOLA ELECTRONICS"},
{0x15BF ,"HIGH TECH COMPUTER CORP (HTC)"},
{0x15C0 ,"BVM LIMITED"},
{0x15C1 ,"QUANTEL"},
{0x15C2 ,"NEWER TECHNOLOGY INC"},
{0x15C3 ,"TAIWAN MYCOMP CO LTD"},
{0x15C4 ,"EVSX, INC"},
{0x15C5 ,"PROCOMP INFORMATICS LTD"},
{0x15C6 ,"TECHNICAL UNIVERSITY OF BUDAPEST"},
{0x15C7 ,"TATEYAMA SYSTEM LABORATORY CO LTD"},
{0x15C8 ,"PENTA MEDIA CO. LTD"},
{0x15C9 ,"SEROME TECHNOLOGY INC"},
{0x15CA ,"BITBOYS OY"},
{0x15CB ,"AG ELECTRONICS LTD"},
{0x15CC ,"HOTRAIL INC."},
{0x15CD ,"DREAMTECH CO LTD"},
{0x15CE ,"GENRAD INC."},
{0x15CF ,"HILSCHER GMBH"},
{0x15D1 ,"INFINEON TECHNOLOGIES AG"},
{0x15D2 ,"FIC (FIRST INTERNATIONAL COMPUTER INC)"},
{0x15D3 ,"NDS TECHNOLOGIES ISRAEL LTD"},
{0x15D4 ,"IWILL CORPORATION"},
{0x15D5 ,"TATUNG CO."},
{0x15D6 ,"ENTRIDIA CORPORATION"},
{0x15D7 ,"ROCKWELL-COLLINS, INC"},
{0x15D8 ,"CYBERNETICS TECHNOLOGY CO LTD"},
{0x15D9 ,"SUPER MICRO COMPUTER INC"},
{0x15DA ,"CYBERFIRM INC."},
{0x15DB ,"APPLIED COMPUTING SYSTEMS INC."},
{0x15DC ,"LITRONIC INC"},
{0x15DD ,"SIGMATEL INC."},
{0x15DE ,"MALLEABLE TECHNOLOGIES INC"},
{0x15DF ,"INFINILINK CORP."},
{0x15E0 ,"CACHEFLOW INC"},
{0x15E1 ,"VOICE TECHNOLOGIES GROUP INC."},
{0x15E2 ,"QUICKNET TECHNOLOGIES INC"},
{0x15E3 ,"NETWORTH TECHNOLOGIES INC"},
{0x15E4 ,"VSN SYSTEMEN BV"},
{0x15E5 ,"VALLEY TECHNOLOGIES INC"},
{0x15E6 ,"AGERE INC."},
{0x15E7 ,"GET ENGINEERING CORP."},
{0x15E8 ,"NATIONAL DATACOMM CORP."},
{0x15E9 ,"PACIFIC DIGITAL CORP."},
{0x15EA ,"TOKYO DENSHI SEKEI K.K."},
{0x15EB ,"DRSEARCH GMBH"},
{0x15EC ,"BECKHOFF GMBH"},
{0x15ED ,"MACROLINK INC"},
{0x15EE ,"IN WIN DEVELOPMENT INC."},
{0x15EF ,"INTELLIGENT PARADIGM INC"},
{0x15F0 ,"B-TREE SYSTEMS INC"},
{0x15F1 ,"TIMES N SYSTEMS INC"},
{0x15F2 ,"DIAGNOSTIC INSTRUMENTS INC"},
{0x15F3 ,"DIGITMEDIA CORP."},
{0x15F4 ,"VALUESOFT"},
{0x15F5 ,"POWER MICRO RESEARCH"},
{0x15F6 ,"EXTREME PACKET DEVICE INC"},
{0x15F7 ,"BANCTEC"},
{0x15F8 ,"KOGA ELECTRONICS CO"},
{0x15F9 ,"ZENITH ELECTRONICS CORPORATION"},
{0x15FA ,"J.P. AXZAM CORPORATION"},
{0x15FB ,"ZILOG INC."},
{0x15FC ,"TECHSAN ELECTRONICS CO LTD"},
{0x15FD ,"N-CUBED.NET"},
{0x15FE ,"KINPO ELECTRONICS INC"},
{0x15FF ,"FASTPOINT TECHNOLOGIES INC."},
{0x1600 ,"NORTHROP GRUMMAN - CANADA LTD"},
{0x1601 ,"TENTA TECHNOLOGY"},
{0x1602 ,"PROSYS-TEC INC."},
{0x1603 ,"NOKIA WIRELESS BUSINESS COMMUNICATIONS"},
{0x1604 ,"CENTRAL SYSTEM RESEARCH CO LTD"},
{0x1605 ,"PAIRGAIN TECHNOLOGIES"},
{0x1606 ,"EUROPOP AG"},
{0x1607 ,"LAVA SEMICONDUCTOR MANUFACTURING INC."},
{0x1608 ,"AUTOMATED WAGERING INTERNATIONAL"},
{0x1609 ,"SCIEMETRIC INSTRUMENTS INC"},
{0x1813 ,"AMBIENT TECHNOLOGIES INC"},
{0x1B13 ,"JATON CORP"},
{0x2001 ,"TEMPORAL RESEARCH LTD"},
{0x270F ,"CHAINTECH COMPUTER CO. LTD"},
{0x3388 ,"HINT CORP"},
{0x3411 ,"QUANTUM DESIGNS (H.K.) INC."},
{0x4005 ,"AVANCE LOGIC INC"},
{0x4033 ,"DELTA NETWORKS INC"},
{0x416C ,"ALADDIN KNOWLEDGE SYSTEMS"},
{0x4444 ,"ICOMPRESION INC."},
{0x4943 ,"GROWTH NETWORKS"},
{0x4CA1 ,"SEANIX TECHNOLOGY INC"},
{0x4D51 ,"MEDIAQ INC."},
{0x4D54 ,"MICROTECHNICA CO LTD"},
{0x5136 ,"S S TECHNOLOGIES"},
{0x5333 ,"S3 INC."},
{0x544C ,"TERALOGIC INC"},
{0x5555 ,"GENROCO INC"},
{0x6409 ,"LOGITEC CORP."},
{0x6666 ,"DECISION COMPUTER INTERNATIONAL CO."},
{0x8086 ,"INTEL CORP."},
{0x8888 ,"SILICON MAGIC CORP."},
{0x8E0E ,"COMPUTONE CORPORATION"},
{0x9004 ,"ADAPTEC"},
{0x919A ,"GIGAPIXEL CORP"},
{0x9699 ,"OMNI MEDIA TECHNOLOGY INC."},
{0xA0A0 ,"AOPEN INC."},
{0xA0F1 ,"UNISYS CORPORATION"},
{0xA259 ,"HEWLETT PACKARD"},
{0xAC1E ,"DIGITAL RECEIVER TECHNOLOGY INC"},
{0xC0DE ,"MOTOROLA"},
{0xC0FE ,"MOTION ENGINEERING, INC."},
{0xCA50 ,"VARIAN AUSTRIALIA PTY LTD"},
{0xCAFE ,"CHRYSALIS-ITS"},
{0xCCCC ,"CATAPULT COMMUNICATIONS"},
{0xD4D4 ,"DY4 SYSTEMS INC"},
{0xE4BF ,"EKF ELEKTRONIK GMBH"},
{0xEA01 ,"EAGLE TECHNOLOGY"},
{0xFA57 ,"FAST SEARCH & TRANSFER ASA"},
{0xFEDA ,"EPIGRAM INC"}
};
-402
View File
@@ -1,402 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
pgflt.c
Abstract:
page fault handling on x86
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
25-Nov-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
////////////////////////////////////////////////////
// GLOBALS
////
char tempPageFault[1024];
extern void NewInt31Handler(void);
ULONG OldIntEHandler=0;
ULONG error_code;
BOOLEAN bInPageFaultHandler = FALSE;
static ULONG PCR_SEL = PCR_SELECTOR;
static ULONG OLD_PCR;
////////////////////////////////////////////////////
// FUNCTIONS
////
//*************************************************************************
// HandleInDebuggerFault()
//
//*************************************************************************
ULONG HandleInDebuggerFault(FRAME* ptr,ULONG address)
{
PEPROCESS tsk;
ENTER_FUNC();
DPRINT((0,"HandleInDebuggerFault(): ###### page fault @ %.8X while inside debugger, eip: %x\n",address, ptr->eip));
// fault in this page fault handler
if(bInPageFaultHandler)
{
DPRINT((0,"HandleInDebuggerFault(): ###### page fault @ %.8X while in page fault handler\n",address));
DPRINT((0,"!!! machine is halted !!!\n"));
__asm__ __volatile__ ("hlt");
LEAVE_FUNC();
return 0;
}
bInPageFaultHandler = TRUE;
// when we come here from DebuggerShell() we live on a different stack
// so the current task is different as well
tsk = IoGetCurrentProcess();
DPRINT((0,"%.8X (%.4X:%.8X %.8X %s %s %s task=%.8X )\n",
address,
ptr->cs,
ptr->eip,
ptr->eflags,
(ptr->error_code&1)?"PLP":"NP",
(ptr->error_code&2)?"WRITE":"READ",
(ptr->error_code&4)?"USER-MODE":"KERNEL-MODE",
(ULONG)tsk));
if(!bInPrintk)
{
DPRINT((0,"HandleInDebuggerFault(): unexpected pagefault in command handler!\n",address));
}
else
{
DPRINT((0,"HandleInDebuggerFault(): unexpected pagefault in command handler while in PrintkCallback()!\n",address));
}
if(tsk)
{
PULONG pPGD;
PULONG pPTE;
pPGD = ADDR_TO_PDE(address);
DPRINT((0,"PGD for %.8X @ %.8X = %.8X\n",address,(ULONG)pPGD,(ULONG)(*pPGD) ));
if(pPGD && (*pPGD)&_PAGE_PRESENT)
{
// not large page
if(!((*pPGD)&_PAGE_4M))
{
pPTE = ADDR_TO_PTE(address);
if(pPTE)
{
DPRINT((0,"PTE for %.8X @ %.8X = %.8X\n",address,(ULONG)pPTE,(ULONG)(*pPTE) ));
}
}
}
}
IntelStackWalk(ptr->eip,CurrentEBP,ulRealStackPtr);
DPRINT((0,"!!! machine is halted !!!\n"));
__asm__ __volatile__ ("hlt");
LEAVE_FUNC();
return 2;
}
//*************************************************************************
// HandlePageFault()
//
// returns:
// 0 = let the system handle it
// 1 = call DebuggerShell()
// 2 = FATAL error inside debugger
//*************************************************************************
ULONG HandlePageFault(FRAME* ptr)
{
PVOID address;
PEPROCESS tsk, tsk1;
PMADDRESS_SPACE vma;
PLIST_ENTRY current_entry;
MEMORY_AREA* current;
ULONG value;
PKTHREAD CurrentThread;
PETHREAD CurrentEThread;
// get linear address of page fault
__asm__ __volatile__("movl %%cr2,%0"
:"=r" (address));
DPRINT((0,"\nPageFault: bInDebShell: %d, error: %d, addr: %x\n", bInDebuggerShell, ptr->error_code, address));
// there's something terribly wrong if we get a fault in our command handler
if(bInDebuggerShell)
{
DPRINT((0,"return handleindebuggerfault\n"));
return HandleInDebuggerFault(ptr,(ULONG)address);
}
ASSERT(IsAddressValid((ULONG)ptr));
// remember error code so we can push it back on the stack
error_code = ptr->error_code;
//ei Check IRQL here!!!
/*
if(in_interrupt())
{
Print(OUTPUT_WINDOW,"pICE: system is currently processing an interrupt!\n");
return 1;
}
*/
// current process
tsk = IoGetCurrentProcess();
DPRINT((0,"tsk: %x\t", tsk));
if( !tsk || !(IsAddressValid((ULONG)tsk))){
DPRINT((0,"tsk address not valid: tsk: %x\n", tsk));
return 0;
}
// lookup VMA for this address
if( (ULONG)address > KERNEL_BASE )
vma = my_init_mm; // use kernel mem area for kernel addresses
else vma = &(tsk->AddressSpace); // otherwise, use user memory area
if( !vma ){
DPRINT((0,"vma not valid: vma: %x\n", vma));
return 0;
}
current_entry = vma->MAreaListHead.Flink;
ASSERT(current_entry);
DPRINT((0,"vma: %x, current_entry: %x, kernel arena: %x\n", vma, current_entry, my_init_mm));
while(current_entry != &vma->MAreaListHead)
{
ASSERT(current_entry);
ASSERT(IsAddressValid((ULONG)current_entry));
current = CONTAINING_RECORD(current_entry,
MEMORY_AREA,
Entry);
if( (address >= current->BaseAddress) && (address <= current->BaseAddress + current->Length ))
{
DPRINT((0,"address: %x %x - %x Attrib: %x, Type: %x\n", address, current->BaseAddress, current->BaseAddress + current->Length, current->Attributes, current->Type));
//page not present
if( !(error_code & 1) ){
//check it is in pageable area
if( current->Type == MEMORY_AREA_SECTION_VIEW ||
current->Type == MEMORY_AREA_VIRTUAL_MEMORY ||
current->Type == MEMORY_AREA_PAGED_POOL ||
current->Type == MEMORY_AREA_SHARED_DATA
){
//ei too much output Print(OUTPUT_WINDOW,"pICE: VMA Pageable Section.\n");
//ei DPRINT((0,"return 0 1\n"));
return 0; //let the system handle this
}
Print(OUTPUT_WINDOW,"pICE: VMA Page not present in non-pageable Section!\n");
//ei DPRINT((0,"Type: currenttype: %x return 1 2\n", current->Type));
return 0;
}
else{ //access violation
if( error_code & 4 )
{ //user mode
if( (ULONG)address >= KERNEL_BASE )
{
Print(OUTPUT_WINDOW,"pICE: User mode program trying to access kernel memory!\n");
//DPRINT((0,"return 0 3\n"));
return 1;
}
//DPRINT((0,"return 0 4\n"));
return 0;
}
/*
if(error_code & 2)
{
//on write
if(!(current->Attributes & PAGE_READONLY))
{
Print(OUTPUT_WINDOW,"pICE: virtual memory arena is not writeable!\n");
return 1;
}
}
// READ ACCESS
else
{
// test EXT bit in error code
if (error_code & 1)
{
Print(OUTPUT_WINDOW,"pICE: page-level protection fault!\n");
return 1;
}
//
*/
/*
if (!(current->Attributes & PAGE_EXECUTE_READ))
{
Print(OUTPUT_WINDOW,"pICE: VMA is not readable!\n");
return 1;
}
*/
// let the system handle it
//DPRINT((0,"return 0 5\n"));
return 0;
}
}
current_entry = current_entry->Flink;
}
Print(OUTPUT_WINDOW,"pICE: no virtual memory arena at this address!\n");
DPRINT((0,"return 0 6\n"));
return 1;
// let the system handle it
// return 0;
}
//*************************************************************************
// NewIntEHandler()
//
//*************************************************************************
__asm__ ("\n\t \
NewIntEHandler:\n\t \
pushfl\n\t \
cli\n\t \
cld\n\t \
pushal\n\t \
pushl %ds\n\t \
\n\t \
// setup default data selectors\n\t \
movw %ss,%ax\n\t \
movw %ax,%ds\n\t \
\n\t \
/*\n\t \
* Load the PCR selector.\n\t \
*/\n\t \
movl %fs, %eax\n\t \
movl %eax, _OLD_PCR\n\t \
movl _PCR_SEL, %eax\n\t \
movl %eax, %fs\n\t \
\n\t \
// get frame ptr\n\t \
lea 40(%esp),%eax\n\t \
pushl %eax\n\t \
call _HandlePageFault\n\t \
addl $4,%esp\n\t \
\n\t \
pushl %eax\n\t \
movl _OLD_PCR, %eax\n\t \
movl %eax, %fs\n\t \
popl %eax\n\t \
\n\t \
cmpl $0,%eax\n\t \
je call_old_inte_handler\n\t \
\n\t \
cmpl $2,%eax\n\t \
je call_handler_unknown_reason\n\t \
\n\t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
// remove error code. will be restored later when we call\n\t \
// original handler again.\n\t \
addl $4,%esp\n\t \
// call debugger loop\n\t \
pushl $" STR(REASON_PAGEFAULT) "\n\t \
jmp NewInt31Handler\n\t \
\n\t \
call_old_inte_handler:\n\t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
// chain to old handler\n\t \
.byte 0x2e\n\t \
jmp *_OldIntEHandler\n\t \
\n\t \
call_handler_unknown_reason:\n\t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
// remove error code. will be restored later when we call\n\t \
// original handler again.\n\t \
addl $4,%esp\n\t \
// call debugger loop\n\t \
pushl $" STR(REASON_INTERNAL_ERROR) "\n\t \
jmp NewInt31Handler\n\t \
");
//*************************************************************************
// InstallIntEHook()
//
//*************************************************************************
void InstallIntEHook(void)
{
ULONG LocalIntEHandler;
ENTER_FUNC();
MaskIrqs();
if(!OldIntEHandler)
{
__asm__ __volatile__("mov $NewIntEHandler,%0"
:"=r" (LocalIntEHandler)
:
:"eax");
OldIntEHandler=SetGlobalInt(0x0E,(ULONG)LocalIntEHandler);
}
UnmaskIrqs();
DPRINT((0,"OldIntE @ %x\n", OldIntEHandler));
LEAVE_FUNC();
}
//*************************************************************************
// DeInstallIntEHook()
//
//*************************************************************************
void DeInstallIntEHook(void)
{
ENTER_FUNC();
MaskIrqs();
if(OldIntEHandler)
{
SetGlobalInt(0x0E,(ULONG)OldIntEHandler);
OldIntEHandler=0;
}
UnmaskIrqs();
LEAVE_FUNC();
}
-34
View File
@@ -1,34 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
pgflt.h
Abstract:
HEADER for pgflt.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.
--*/
void InstallIntEHook(void);
void DeInstallIntEHook(void);
extern ULONG error_code;
-7
View File
@@ -1,7 +0,0 @@
/* $Id$ */
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "PICE Debugger\0"
#define REACTOS_STR_INTERNAL_NAME "pice\0"
#define REACTOS_STR_ORIGINAL_FILENAME "pice.sys\0"
#include <reactos/version.rc>
-36
View File
@@ -1,36 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
pice_ver.h
Abstract:
HEADER , pICE debugger version
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.
--*/
// versions below 1.0 are BETA
#define PICE_MAJOR_VERSION (0)
#define PICE_MINOR_VERSION (99)
// reset this on major or minor version change
// increment this on every release build
#define PICE_BUILD (0007)
-65
View File
@@ -1,65 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
precomp.h
Abstract:
precompiled headers
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.
--*/
#define FRAMEBUFFER_SIZE (0x8000)
#define LINES_IN_BUFFER (2048)
#include <ntddk.h>
#include <ntos/types.h>
#include <types.h>
//#include <i386/tss.h>
#include <internal/ob.h>
#include <internal/i386/segment.h>
#include <defines.h>
#include "retypes.h"
//#include <asm/segment.h>
#include "../shared/shared.h"
#include "debug.h"
#include "hardware.h"
#include "utils.h"
#include "init.h"
#include "shell.h"
#include "trace.h"
#include "hooks.h"
#include "patch.h" // patch the keyboard driver
#include "symbols.h"
#include "parse.h"
#include "syscall.h"
#include "bp.h"
#include "scancodes.h"
#include "output.h"
#include "dblflt.h"
#include "pgflt.h"
#include "gpfault.h"
#include "serial.h"
#include "hercules.h"
#include "vga.h"
#include "pice_ver.h"
-203
View File
@@ -1,203 +0,0 @@
/*++
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);
}
}
-122
View File
@@ -1,122 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
regs.h
Abstract:
HEADER for disasm.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.
--*/
#define REGGS 0
#define REGFS 1
#define REGES 2
#define REGDS 3
#define REGEDI 4
#define REGESI 5
#define REGEBX 6
#define REGEDX 7
#define REGECX 8
#define REGEAX 9
#define REGEBP 10
#define REGEIP 11
#define REGCS 12
#define REGEFL 13
#define REGESP 14
#define REGSS 15
#ifdef KERNEL
#define REGCR0 16
#define REGCR2 17
#define REGCR3 18
#define REGCR4 19
#endif
#define REGDR0 20
#define REGDR1 21
#define REGDR2 22
#define REGDR3 23
#define REGDR6 24
#define REGDR7 25
#ifdef KERNEL
#define REGGDTR 26
#define REGGDTL 27
#define REGIDTR 28
#define REGIDTL 29
#define REGTR 30
#define REGLDTR 31
#endif
// Pseudo-registers:
#define PREGEA 40
#define PREGBASE PREGEA
#define PREGEXP 41
#define PREGRA 42
#define PREGP 43
#define PREGU0 44
#define PREGU1 45
#define PREGU2 46
#define PREGU3 47
#define PREGU4 48
#define PREGU5 49
#define PREGU6 50
#define PREGU7 51
#define PREGU8 52
#define PREGU9 53
#define FLAGBASE 100
#define REGDI 100
#define REGSI 101
#define REGBX 102
#define REGDX 103
#define REGCX 104
#define REGAX 105
#define REGBP 106
#define REGIP 107
#define REGFL 108
#define REGSP 109
#define REGBL 110
#define REGDL 111
#define REGCL 112
#define REGAL 113
#define REGBH 114
#define REGDH 115
#define REGCH 116
#define REGAH 117
#define FLAGIOPL 118
#define FLAGOF 119
#define FLAGDF 120
#define FLAGIF 121
#define FLAGTF 122
#define FLAGSF 123
#define FLAGZF 124
#define FLAGAF 125
#define FLAGPF 126
#define FLAGCF 127
#define FLAGVIP 128
#define FLAGVIF 129
#define REGFIR REGEIP
-33
View File
@@ -1,33 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
remods.h
Abstract:
HEADER for kernel module creation
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.
--*/
-52
View File
@@ -1,52 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
retypes.h
Abstract:
HEADER for type remapping (porting from NT code)
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.
--*/
//typedef unsigned int ULONG,*PULONG;
//typedef unsigned short USHORT,*PUSHORT;
//typedef unsigned char UCHAR,*PUCHAR,BYTE,*PBYTE;
//typedef signed int LONG,*PLONG;
//typedef signed short SHORT,*PSHORT;
//typedef signed char CHAR,*PCHAR,*LPSTR,*PSTR;
//typedef unsigned short WCHAR;
//typedef void VOID,*PVOID;
//typedef char BOOLEAN,*PBOOLEAN;
//#define FALSE (0==1)
//#define TRUE (1==1)
#ifndef NULL
#define NULL ((void*)0)
#endif
// dimension macro
#define DIM(name) (sizeof(name)/sizeof(name[0]))
-106
View File
@@ -1,106 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
scancodes.h
Abstract:
HEADER, scancodes of IBM keyboard
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.
--*/
/*
** Scan Code Definitions . . .
*/
// System Keys
#define SCANCODE_ESC 0x01
#define SCANCODE_BACKSPACE 0x0E
#define SCANCODE_TAB 0x0F
#define SCANCODE_ENTER 0x1C
#define SCANCODE_L_CTRL 0x1D
#define SCANCODE_R_CTRL 0x5A
#define SCANCODE_L_SHIFT 0x2A
#define SCANCODE_R_SHIFT 0x36
#define SCANCODE_L_ALT 0x38
#define SCANCODE_R_ALT 0x5C
#define SCANCODE_SPACE 0x39
#define SCANCODE_CAPS_LOCK 0x3A
#define SCANCODE_NUM_LOCK 0x45
#define SCANCODE_PRNT_SCRN 0x47
#define SCANCODE_SCROLL_LOCK 0x57
// Function Keys
#define SCANCODE_F1 0x3b
#define SCANCODE_F2 0x3c
#define SCANCODE_F3 0x3d
#define SCANCODE_F4 0x3e
#define SCANCODE_F5 0x3f
#define SCANCODE_F6 0x40
#define SCANCODE_F7 0x41
#define SCANCODE_F8 0x42
#define SCANCODE_F9 0x43
#define SCANCODE_F10 0x44
#define SCANCODE_F11 0x57
#define SCANCODE_F12 0x58
// Directional Control Keys
#define SCANCODE_HOME 0x47
#define SCANCODE_UP 0x48
#define SCANCODE_PGUP 0x49
#define SCANCODE_LEFT 0x4b
#define SCANCODE_CENTER 0x4c
#define SCANCODE_RIGHT 0x4d
#define SCANCODE_END 0x4f
#define SCANCODE_DOWN 0x50
#define SCANCODE_PGDN 0x51
#define SCANCODE_INS 0x52
#define SCANCODE_DEL 0x53
// Cluster Directional Control Keys
#define SCANCODE_C_ENTER 0x59
#define SCANCODE_C_HOME 0x5d
#define SCANCODE_C_UP 0x5e
#define SCANCODE_C_PGUP 0x5f
#define SCANCODE_C_LEFT 0x60
#define SCANCODE_C_RIGHT 0x61
#define SCANCODE_C_END 0x62
#define SCANCODE_C_DOWN 0x63
#define SCANCODE_C_PGDN 0x64
#define SCANCODE_C_INS 0x65
#define SCANCODE_C_DEL 0x66
// Alphanumerics
#define SCANCODE_1 0x02
#define SCANCODE_2 0x03
#define SCANCODE_3 0x04
#define SCANCODE_4 0x05
#define SCANCODE_5 0x06
#define SCANCODE_6 0x07
#define SCANCODE_7 0x08
#define SCANCODE_8 0x09
#define SCANCODE_9 0x0A
#define SCANCODE_0 0x0B
#define SCANCODE_EXTENDED 0xE0
-656
View File
@@ -1,656 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
serial.c
Abstract:
serial debugger connection
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
19-Aug-2000: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
#include "remods.h"
#include "precomp.h"
#include "serial_port.h"
BOOLEAN SerialReadByte(PUCHAR px);
// used for SERIAL window creation
// NB: at the moment the terminal is 60 lines high.
WINDOW wWindowSerial[4]=
{
{1,3,1,0,FALSE},
{5,8,1,0,FALSE},
{14,26,1,0,FALSE},
{41,18,1,0,FALSE}
};
PUCHAR pScreenBufferSerial;
USHORT usSerialPortBase;
UCHAR packet[_PAGE_SIZE];
UCHAR assemble_packet[_PAGE_SIZE];
UCHAR flush_buffer[_PAGE_SIZE],g_x,g_y;
ULONG ulFlushBufferPos = 0;
UCHAR ucLastKeyRead;
ECOLORS eForegroundColor=WHITE,eBackgroundColor=BLACK;
///************************************************************************
// SerialSetSpeed()
//
///************************************************************************
void SerialSetSpeed(ULONG baudrate)
{
UCHAR c;
ULONG divisor;
divisor = (ULONG) (115200L/baudrate);
c = inportb((USHORT)(usSerialPortBase + LCR));
outportb((USHORT)(usSerialPortBase + LCR), (UCHAR)(c | 0x80)); // Set DLAB
outportb((USHORT)(usSerialPortBase + DLL), (UCHAR)(divisor & 0x00FF));
outportb((USHORT)(usSerialPortBase + DLH), (UCHAR)((divisor >> 8) & 0x00FF));
outportb((USHORT)(usSerialPortBase + LCR), c); // Reset DLAB
}
///************************************************************************
// SerialSetOthers()
//
// Set other communications parameters
//************************************************************************
void SerialSetOthers(ULONG Parity, ULONG Bits, ULONG StopBit)
{
ULONG setting;
UCHAR c;
if (usSerialPortBase == 0) return ;
if (Bits < 5 || Bits > 8) return ;
if (StopBit != 1 && StopBit != 2) return ;
if (Parity != NO_PARITY && Parity != ODD_PARITY && Parity != EVEN_PARITY)
return;
setting = Bits-5;
setting |= ((StopBit == 1) ? 0x00 : 0x04);
setting |= Parity;
c = inportb((USHORT)(usSerialPortBase + LCR));
outportb((USHORT)(usSerialPortBase + LCR), (UCHAR)(c & ~0x80)); // Reset DLAB
// no ints
outportb((USHORT)(usSerialPortBase + IER), (UCHAR)0);
// clear FIFO and disable them
outportb((USHORT)(usSerialPortBase + FCR), (UCHAR)0);
outportb((USHORT)(usSerialPortBase + LCR), (UCHAR)setting);
outportb((USHORT)(usSerialPortBase + MCR), DTR | RTS);
return ;
}
///************************************************************************
// FlushSerialBuffer()
//
///************************************************************************
void FlushSerialBuffer(void)
{
UCHAR c;
while(SerialReadByte(&c));
}
///************************************************************************
// SetupSerial()
//
///************************************************************************
void SetupSerial(ULONG port,ULONG baudrate)
{
USHORT ports[]={COM1BASE,COM2BASE,COM3BASE,COM4BASE};
usSerialPortBase = ports[port-1];
SerialSetOthers(NO_PARITY,8,1);
SerialSetSpeed(baudrate);
// clear out received bytes
// else we would think there's a terminal connected
FlushSerialBuffer();
}
///************************************************************************
// SerialReadByte()
//
// Output a character to the serial port
//************************************************************************
BOOLEAN SerialReadByte(PUCHAR px)
{
ULONG timeout;
timeout = 0x00FFFFL;
// Wait for transmitter to clear
while ((inportb((USHORT)(usSerialPortBase + LSR)) & RCVRDY) == 0)
if (!(--timeout))
{
return FALSE;
}
*px = inportb((USHORT)(usSerialPortBase + RXR));
return TRUE;
}
///************************************************************************
// SerialSendByte()
//
// Output a character to the serial port
//************************************************************************
BOOLEAN SerialSendByte(UCHAR x)
{
ULONG timeout;
timeout = 0x00FFFFL;
// Wait for transmitter to clear
while ((inportb((USHORT)(usSerialPortBase + LSR)) & XMTRDY) == 0)
if (!(--timeout))
{
return FALSE;
}
outportb((USHORT)(usSerialPortBase + TXR), x);
return TRUE;
}
//************************************************************************
// CheckSum()
//
//************************************************************************
UCHAR CheckSum(LPSTR p,ULONG Len)
{
UCHAR ucCheckSum = 0;
ULONG i;
for(i=0;i<Len;i++)
{
ucCheckSum ^= *p++;
ucCheckSum += 1;
}
return ucCheckSum;
}
///************************************************************************
// ReadPacket()
//
///************************************************************************
BOOLEAN ReadPacket(PSERIAL_PACKET p)
{
return TRUE;
}
///************************************************************************
// SendPacket()
//
///************************************************************************
BOOLEAN SendPacket(PSERIAL_PACKET p)
{
PUCHAR pHeader = (PUCHAR)&p->header;
ULONG i;
UCHAR c;
ULONG timeout;
do
{
timeout = 10;
pHeader = (PUCHAR)&p->header;
for(i=0;i<(sizeof(SERIAL_PACKET_HEADER)+p->header.packet_size);i++)
{
if(!SerialSendByte(*pHeader++))
{
return FALSE;
}
}
do
{
c = 0;
SerialReadByte(&c);
if(c != ACK)
ucLastKeyRead = c;
}while(c != ACK && timeout--);
}while(c != ACK);
return TRUE;
}
///************************************************************************
// SendPacketTimeout()
//
///************************************************************************
BOOLEAN SendPacketTimeout(PSERIAL_PACKET p)
{
PUCHAR pHeader = (PUCHAR)&p->header;
ULONG i;
UCHAR c;
ULONG timeout = 20;
BOOLEAN bResult = TRUE;
pHeader = (PUCHAR)&p->header;
for(i=0;i<(sizeof(SERIAL_PACKET_HEADER)+p->header.packet_size);i++)
{
if(!SerialSendByte(*pHeader++))
{
return FALSE;
}
}
do
{
c = 0xFF;
SerialReadByte(&c);
}while(c != ACK && timeout--);
if(c != ACK)
bResult = FALSE;
return bResult;
}
//************************************************************************
// AssemblePacket()
//
//************************************************************************
PSERIAL_PACKET AssemblePacket(PUCHAR pData,ULONG ulSize)
{
PSERIAL_PACKET p;
ULONG ulCheckSum;
p = (PSERIAL_PACKET)assemble_packet;
// fill in header
p->header.packet_chksum = CheckSum(pData,ulSize);
p->header.packet_size = ulSize;
p->header.packet_header_chksum = 0;
ulCheckSum = (ULONG)CheckSum((PUCHAR)p,sizeof(SERIAL_PACKET_HEADER));
p->header.packet_header_chksum = ulCheckSum;
// attach data to packet
PICE_memcpy(p->data,pData,ulSize);
return p;
}
// OUTPUT handlers
//*************************************************************************
// SetForegroundColorVga()
//
//*************************************************************************
void SetForegroundColorSerial(ECOLORS col)
{
eForegroundColor = col;
}
//*************************************************************************
// SetBackgroundColorVga()
//
//*************************************************************************
void SetBackgroundColorSerial(ECOLORS col)
{
eBackgroundColor = col;
}
//*************************************************************************
// PrintGrafSerial()
//
//*************************************************************************
void PrintGrafSerial(ULONG x,ULONG y,UCHAR c)
{
// put this into memory
pScreenBufferSerial[y*GLOBAL_SCREEN_WIDTH + x] = c;
// put this into cache
if(ulFlushBufferPos == 0)
{
g_x = x;
g_y = y;
}
flush_buffer[ulFlushBufferPos++] = c;
}
//*************************************************************************
// FlushSerial()
//
//*************************************************************************
void FlushSerial(void)
{
PSERIAL_DATA_PACKET_PRINT pPrint;
PSERIAL_PACKET p;
pPrint = (PSERIAL_DATA_PACKET_PRINT)packet;
pPrint->type = PACKET_TYPE_PRINT;
pPrint->x = g_x;
pPrint->y = g_y;
pPrint->fgcol = eForegroundColor;
pPrint->bkcol = eBackgroundColor;
flush_buffer[ulFlushBufferPos++] = 0;
PICE_strcpy(pPrint->string,flush_buffer);
ulFlushBufferPos = 0;
p = AssemblePacket((PUCHAR)pPrint,sizeof(SERIAL_DATA_PACKET_PRINT)+PICE_strlen(flush_buffer));
SendPacket(p);
}
//*************************************************************************
// ShowCursorSerial()
//
// show hardware cursor
//*************************************************************************
void ShowCursorSerial(void)
{
PSERIAL_DATA_PACKET_CURSOR pCursor;
PSERIAL_PACKET p;
ENTER_FUNC();
bCursorEnabled = TRUE;
pCursor = (PSERIAL_DATA_PACKET_CURSOR)packet;
pCursor->type = PACKET_TYPE_CURSOR;
pCursor->state = (UCHAR)TRUE;
pCursor->x = (UCHAR)wWindow[OUTPUT_WINDOW].usCurX;
pCursor->y = (UCHAR)wWindow[OUTPUT_WINDOW].usCurY;
p = AssemblePacket((PUCHAR)pCursor,sizeof(SERIAL_DATA_PACKET_CURSOR));
SendPacket(p);
LEAVE_FUNC();
}
//*************************************************************************
// HideCursorSerial()
//
// hide hardware cursor
//*************************************************************************
void HideCursorSerial(void)
{
PSERIAL_DATA_PACKET_CURSOR pCursor;
PSERIAL_PACKET p;
ENTER_FUNC();
bCursorEnabled = FALSE;
pCursor = (PSERIAL_DATA_PACKET_CURSOR)packet;
pCursor->type = PACKET_TYPE_CURSOR;
pCursor->state = (UCHAR)TRUE;
p = AssemblePacket((PUCHAR)pCursor,sizeof(SERIAL_DATA_PACKET_CURSOR));
SendPacket(p);
LEAVE_FUNC();
}
//*************************************************************************
// CopyLineToSerial()
//
// copy a line from src to dest
//*************************************************************************
void CopyLineToSerial(USHORT dest,USHORT src)
{
NOT_IMPLEMENTED();
}
//*************************************************************************
// InvertLineSerial()
//
// invert a line on the screen
//*************************************************************************
void InvertLineSerial(ULONG line)
{
PSERIAL_DATA_PACKET_INVERTLINE pInvertLine;
PSERIAL_PACKET p;
pInvertLine = (PSERIAL_DATA_PACKET_INVERTLINE)packet;
pInvertLine->type = PACKET_TYPE_INVERTLINE;
pInvertLine->line = line;
p = AssemblePacket((PUCHAR)pInvertLine,sizeof(SERIAL_DATA_PACKET_INVERTLINE));
SendPacket(p);
}
//*************************************************************************
// HatchLineSerial()
//
// hatches a line on the screen
//*************************************************************************
void HatchLineSerial(ULONG line)
{
NOT_IMPLEMENTED();
}
//*************************************************************************
// ClrLineSerial()
//
// clear a line on the screen
//*************************************************************************
void ClrLineSerial(ULONG line)
{
PSERIAL_DATA_PACKET_CLRLINE pClrLine;
PSERIAL_PACKET p;
pClrLine = (PSERIAL_DATA_PACKET_CLRLINE)packet;
pClrLine->type = PACKET_TYPE_CLRLINE;
pClrLine->fgcol = eForegroundColor;
pClrLine->bkcol = eBackgroundColor;
pClrLine->line = line;
p = AssemblePacket((PUCHAR)pClrLine,sizeof(SERIAL_DATA_PACKET_CLRLINE));
SendPacket(p);
}
//*************************************************************************
// PrintLogoSerial()
//
//*************************************************************************
void PrintLogoSerial(BOOLEAN bShow)
{
NOT_IMPLEMENTED();
}
//*************************************************************************
// PrintCursorSerial()
//
// emulate a blinking cursor block
//*************************************************************************
void PrintCursorSerial(BOOLEAN bForce)
{
NOT_IMPLEMENTED();
}
//*************************************************************************
// SaveGraphicsStateSerial()
//
//*************************************************************************
void SaveGraphicsStateSerial(void)
{
// not implemented
}
//*************************************************************************
// RestoreGraphicsStateSerial()
//
//*************************************************************************
void RestoreGraphicsStateSerial(void)
{
// not implemented
}
// INPUT handlers
//*************************************************************************
// GetKeyPolledSerial()
//
//*************************************************************************
UCHAR GetKeyPolledSerial(void)
{
UCHAR ucResult;
PSERIAL_DATA_PACKET_POLL pPoll;
PSERIAL_PACKET p;
pPoll = (PSERIAL_DATA_PACKET_POLL)packet;
pPoll->type = PACKET_TYPE_POLL;
pPoll->major_version = PICE_MAJOR_VERSION;
pPoll->minor_version = PICE_MINOR_VERSION;
pPoll->build_number = PICE_BUILD;
p = AssemblePacket((PUCHAR)pPoll,sizeof(SERIAL_DATA_PACKET_POLL));
SendPacket(p);
ucResult = ucLastKeyRead;
ucLastKeyRead = 0;
return ucResult;
}
//*************************************************************************
// FlushKeyboardQueueSerial()
//
//*************************************************************************
void FlushKeyboardQueueSerial(void)
{
// not implemented
}
//*************************************************************************
// Connect()
//
//*************************************************************************
BOOLEAN Connect(USHORT xSize,USHORT ySize)
{
PSERIAL_DATA_PACKET_CONNECT pConnect;
PSERIAL_PACKET p;
pConnect = (PSERIAL_DATA_PACKET_CONNECT)packet;
pConnect->type = PACKET_TYPE_CONNECT;
pConnect->xsize = xSize;
pConnect->ysize = ySize;
p = AssemblePacket((PUCHAR)pConnect,sizeof(SERIAL_DATA_PACKET_CONNECT));
return SendPacketTimeout(p);
}
//*************************************************************************
// ConsoleInitSerial()
//
// init terminal screen
//*************************************************************************
BOOLEAN ConsoleInitSerial(void)
{
BOOLEAN bResult = FALSE;
ENTER_FUNC();
ohandlers.CopyLineTo = CopyLineToSerial;
ohandlers.PrintGraf = PrintGrafSerial;
ohandlers.Flush = FlushSerial;
ohandlers.ClrLine = ClrLineSerial;
ohandlers.InvertLine = InvertLineSerial;
ohandlers.HatchLine = HatchLineSerial;
ohandlers.PrintLogo = PrintLogoSerial;
ohandlers.PrintCursor = PrintCursorSerial;
ohandlers.SaveGraphicsState = SaveGraphicsStateSerial;
ohandlers.RestoreGraphicsState = RestoreGraphicsStateSerial;
ohandlers.ShowCursor = ShowCursorSerial;
ohandlers.HideCursor = HideCursorSerial;
ohandlers.SetForegroundColor = SetForegroundColorSerial;
ohandlers.SetBackgroundColor = SetBackgroundColorSerial;
ihandlers.GetKeyPolled = GetKeyPolledSerial;
ihandlers.FlushKeyboardQueue = FlushKeyboardQueueSerial;
SetWindowGeometry(wWindowSerial);
GLOBAL_SCREEN_WIDTH = 80;
GLOBAL_SCREEN_HEIGHT = 60;
pScreenBufferSerial = PICE_malloc(FRAMEBUFFER_SIZE, NONPAGEDPOOL);
if(pScreenBufferSerial)
{
bResult = TRUE;
EmptyRingBuffer();
SetupSerial(1,115200);
// connect to terminal, if none's there, we give up
bResult = Connect(GLOBAL_SCREEN_WIDTH,GLOBAL_SCREEN_HEIGHT);
if(bResult)
{
GetKeyPolledSerial();
}
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// ConsoleShutdownSerial()
//
// exit terminal screen
//*************************************************************************
void ConsoleShutdownSerial(void)
{
ENTER_FUNC();
Connect(80,25);
FlushSerialBuffer();
if(pScreenBufferSerial)
PICE_free(pScreenBufferSerial);
LEAVE_FUNC();
}
-36
View File
@@ -1,36 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
serial.h
Abstract:
HEADER for serial.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.
--*/
void SendString(LPSTR s);
void SetupSerial(ULONG port,ULONG baudrate);
BOOLEAN ConsoleInitSerial(void);
void ConsoleShutdownSerial(void);
@@ -1,173 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
serial_port.h
Abstract:
HEADER for serial.c
serial port HW defines
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.
--*/
#define COM1 1
#define COM2 2
#define COM1BASE 0x3F8 /* Base port address for COM1 */
#define COM2BASE 0x2F8 /* Base port address for COM2 */
// FIX these
#define COM3BASE 0x3F8 /* Base port address for COM3 */
#define COM4BASE 0x2F8 /* Base port address for COM4 */
/*
The 8250 UART has 10 registers accessible through 7 port addresses.
Here are their addresses relative to COM1BASE and COM2BASE. Note
that the baud rate registers, (DLL) and (DLH) are active only when
the Divisor-Latch Access-Bit (DLAB) is on. The (DLAB) is bit 7 of
the (LCR).
o TXR Output data to the serial port.
o RXR Input data from the serial port.
o LCR Initialize the serial port.
o IER Controls interrupt generation.
o IIR Identifies interrupts.
o MCR Send contorl signals to the modem.
o LSR Monitor the status of the serial port.
o MSR Receive status of the modem.
o DLL Low byte of baud rate divisor.
o DHH High byte of baud rate divisor.
*/
#define TXR 0 /* Transmit register (WRITE) */
#define RXR 0 /* Receive register (READ) */
#define IER 1 /* Interrupt Enable */
#define IIR 2 /* Interrupt ID */
#define FCR 2 /* FIFO control */
#define LCR 3 /* Line control */
#define MCR 4 /* Modem control */
#define LSR 5 /* Line Status */
#define MSR 6 /* Modem Status */
#define DLL 0 /* Divisor Latch Low */
#define DLH 1 /* Divisor latch High */
/*-------------------------------------------------------------------*
Bit values held in the Line Control Register (LCR).
bit meaning
--- -------
0-1 00=5 bits, 01=6 bits, 10=7 bits, 11=8 bits.
2 Stop bits.
3 0=parity off, 1=parity on.
4 0=parity odd, 1=parity even.
5 Sticky parity.
6 Set break.
7 Toggle port addresses.
*-------------------------------------------------------------------*/
#define NO_PARITY 0x00
#define EVEN_PARITY 0x18
#define ODD_PARITY 0x08
/*-------------------------------------------------------------------*
Bit values held in the Line Status Register (LSR).
bit meaning
--- -------
0 Data ready.
1 Overrun error - Data register overwritten.
2 Parity error - bad transmission.
3 Framing error - No stop bit was found.
4 Break detect - End to transmission requested.
5 Transmitter holding register is empty.
6 Transmitter shift register is empty.
7 Time out - off line.
*-------------------------------------------------------------------*/
#define RCVRDY 0x01
#define OVRERR 0x02
#define PRTYERR 0x04
#define FRMERR 0x08
#define BRKERR 0x10
#define XMTRDY 0x20
#define XMTRSR 0x40
#define TIMEOUT 0x80
/*-------------------------------------------------------------------*
Bit values held in the Modem Output Control Register (MCR).
bit meaning
--- -------
0 Data Terminal Ready. Computer ready to go.
1 Request To Send. Computer wants to send data.
2 auxillary output #1.
3 auxillary output #2.(Note: This bit must be
set to allow the communications card to send
interrupts to the system)
4 UART ouput looped back as input.
5-7 not used.
*------------------------------------------------------------------*/
#define DTR 0x01
#define RTS 0x02
/*------------------------------------------------------------------*
Bit values held in the Modem Input Status Register (MSR).
bit meaning
--- -------
0 delta Clear To Send.
1 delta Data Set Ready.
2 delta Ring Indicator.
3 delta Data Carrier Detect.
4 Clear To Send.
5 Data Set Ready.
6 Ring Indicator.
7 Data Carrier Detect.
*------------------------------------------------------------------*/
#define CTS 0x10
#define DSR 0x20
/*------------------------------------------------------------------*
Bit values held in the Interrupt Enable Register (IER).
bit meaning
--- -------
0 Interrupt when data received.
1 Interrupt when transmitter holding reg. empty.
2 Interrupt when data reception error.
3 Interrupt when change in modem status register.
4-7 Not used.
*------------------------------------------------------------------*/
#define RX_INT 0x01
/*------------------------------------------------------------------*
Bit values held in the Interrupt Identification Register (IIR).
bit meaning
--- -------
0 Interrupt pending
1-2 Interrupt ID code
00=Change in modem status register,
01=Transmitter holding register empty,
10=Data received,
11=reception error, or break encountered.
3-7 Not used.
*------------------------------------------------------------------*/
#define RX_ID 0x04
#define RX_MASK 0x07
File diff suppressed because it is too large Load Diff
-91
View File
@@ -1,91 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
shell.h
Abstract:
HEADER for shell.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.
--*/
//void InstallKeyboardHook(void);
//void DeInstallKeyboardHook(void);
void InstallGlobalKeyboardHook(void);
void DeInstallGlobalKeyboardHook(void);
void RealIsr(ULONG dwReasonForBreak);
void NewInt31Handler(void);
extern volatile BOOLEAN bNotifyToExit;
extern volatile BOOLEAN bSingleStep;
extern volatile UCHAR ucKeyPressedWhileIdle;
extern volatile BOOLEAN bInDebuggerShell;
extern ULONG CurrentEIP,CurrentEFL;
extern ULONG CurrentEAX,CurrentEBX,CurrentECX,CurrentEDX;
extern ULONG CurrentESP,CurrentEBP,CurrentESI,CurrentEDI;
extern ULONG CurrentDR0,CurrentDR1,CurrentDR2,CurrentDR3,CurrentDR6,CurrentDR7;
extern ULONG CurrentCR0,CurrentCR2,CurrentCR3;
extern USHORT CurrentCS,CurrentDS,CurrentES,CurrentFS,CurrentGS,CurrentSS;
extern volatile BOOLEAN bControl; // TRUE when CTRL key was pressed
extern volatile BOOLEAN bShift; // TRUE when SHIFT key was pressed
extern volatile BOOLEAN bAlt; // TRUE when SHIFT key was pressed
// previous context
extern ULONG OldEIP,OldEFL;
extern ULONG OldEAX,OldEBX,OldECX,OldEDX;
extern ULONG OldESP,OldEBP,OldESI,OldEDI;
extern USHORT OldCS,OldDS,OldES,OldFS,OldGS,OldSS;
extern ULONG CurrentProcess;
extern USHORT OldSelector;
extern ULONG OldOffset;
extern ULONG ulRealStackPtr; // serves as current process pointer too!!
extern ULONG g_ulLineNumberStart;
extern BOOLEAN bStepThroughSource;
extern BOOLEAN bStepInto;
#define REASON_INT3 (0)
#define REASON_SINGLESTEP (1)
#define REASON_CTRLF (2)
#define REASON_PAGEFAULT (3)
#define REASON_GP_FAULT (4)
#define REASON_HARDWARE_BP (5)
#define REASON_DOUBLE_FAULT (6)
#define REASON_MODULE_LOAD (7)
#define REASON_INTERNAL_ERROR (8)
extern volatile BOOLEAN bEnterNow;
// keyboard controller defines
#define I8042_PHYSICAL_BASE 0x60
#define I8042_DATA_REGISTER_OFFSET 0
#define I8042_COMMAND_REGISTER_OFFSET 4
#define I8042_STATUS_REGISTER_OFFSET 4
void ShowStatusLine(void);
#define KEYBOARD_IRQ 1
-265
View File
@@ -1,265 +0,0 @@
/* Table of DBX symbol codes for the GNU system.
Copyright (C) 1988, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* New stab from Solaris 2. This uses an n_type of 0, which in a.out files
overlaps the N_UNDF used for ordinary symbols. In ELF files, the
debug information is in a different file section, so there is no conflict.
This symbol's n_value gives the size of the string section associated
with this file. The symbol's n_strx (relative to the just-updated
string section start address) gives the name of the source file,
e.g. "foo.c", without any path information. The symbol's n_desc gives
the count of upcoming symbols associated with this file (not including
this one). */
__define_stab (N_UNDF, 0x00, "UNDF")
/* Global variable. Only the name is significant.
To find the address, look in the corresponding external symbol. */
__define_stab (N_GSYM, 0x20, "GSYM")
/* Function name for BSD Fortran. Only the name is significant.
To find the address, look in the corresponding external symbol. */
__define_stab (N_FNAME, 0x22, "FNAME")
/* Function name or text-segment variable for C. Value is its address.
Desc is supposedly starting line number, but GCC doesn't set it
and DBX seems not to miss it. */
__define_stab (N_FUN, 0x24, "FUN")
/* Data-segment variable with internal linkage. Value is its address.
"Static Sym". */
__define_stab (N_STSYM, 0x26, "STSYM")
/* BSS-segment variable with internal linkage. Value is its address. */
__define_stab (N_LCSYM, 0x28, "LCSYM")
/* Name of main routine. Only the name is significant. */
__define_stab (N_MAIN, 0x2a, "MAIN")
/* Solaris2: Read-only data symbols. */
__define_stab (N_ROSYM, 0x2c, "ROSYM")
/* Global symbol in Pascal.
Supposedly the value is its line number; I'm skeptical. */
__define_stab (N_PC, 0x30, "PC")
/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */
__define_stab (N_NSYMS, 0x32, "NSYMS")
/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */
__define_stab (N_NOMAP, 0x34, "NOMAP")
/* New stab from Solaris 2. Like N_SO, but for the object file. Two in
a row provide the build directory and the relative path of the .o from it.
Solaris2 uses this to avoid putting the stabs info into the linked
executable; this stab goes into the ".stab.index" section, and the debugger
reads the real stabs directly from the .o files instead. */
__define_stab (N_OBJ, 0x38, "OBJ")
/* New stab from Solaris 2. Options for the debugger, related to the
source language for this module. E.g. whether to use ANSI
integral promotions or traditional integral promotions. */
__define_stab (N_OPT, 0x3c, "OPT")
/* Register variable. Value is number of register. */
__define_stab (N_RSYM, 0x40, "RSYM")
/* Modula-2 compilation unit. Can someone say what info it contains? */
__define_stab (N_M2C, 0x42, "M2C")
/* Line number in text segment. Desc is the line number;
value is corresponding address. On Solaris2, the line number is
relative to the start of the current function. */
__define_stab (N_SLINE, 0x44, "SLINE")
/* Similar, for data segment. */
__define_stab (N_DSLINE, 0x46, "DSLINE")
/* Similar, for bss segment. */
__define_stab (N_BSLINE, 0x48, "BSLINE")
/* Sun's source-code browser stabs. ?? Don't know what the fields are.
Supposedly the field is "path to associated .cb file". THIS VALUE
OVERLAPS WITH N_BSLINE! */
__define_stab_duplicate (N_BROWS, 0x48, "BROWS")
/* GNU Modula-2 definition module dependency. Value is the modification time
of the definition file. Other is non-zero if it is imported with the
GNU M2 keyword %INITIALIZE. Perhaps N_M2C can be used if there
are enough empty fields? */
__define_stab(N_DEFD, 0x4a, "DEFD")
/* New in Solaris2. Function start/body/end line numbers. */
__define_stab(N_FLINE, 0x4C, "FLINE")
/* THE FOLLOWING TWO STAB VALUES CONFLICT. Happily, one is for Modula-2
and one is for C++. Still,... */
/* GNU C++ exception variable. Name is variable name. */
__define_stab (N_EHDECL, 0x50, "EHDECL")
/* Modula2 info "for imc": name,,0,0,0 according to Ultrix V4.0. */
__define_stab_duplicate (N_MOD2, 0x50, "MOD2")
/* GNU C++ `catch' clause. Value is its address. Desc is nonzero if
this entry is immediately followed by a CAUGHT stab saying what exception
was caught. Multiple CAUGHT stabs means that multiple exceptions
can be caught here. If Desc is 0, it means all exceptions are caught
here. */
__define_stab (N_CATCH, 0x54, "CATCH")
/* Structure or union element. Value is offset in the structure. */
__define_stab (N_SSYM, 0x60, "SSYM")
/* Solaris2: Last stab emitted for module. */
__define_stab (N_ENDM, 0x62, "ENDM")
/* Name of main source file.
Value is starting text address of the compilation.
If multiple N_SO's appear, the first to contain a trailing / is the
compilation directory. The first to not contain a trailing / is the
source file name, relative to the compilation directory. Others (perhaps
resulting from cfront) are ignored.
On Solaris2, value is undefined, but desc is a source-language code. */
__define_stab (N_SO, 0x64, "SO")
/* Automatic variable in the stack. Value is offset from frame pointer.
Also used for type descriptions. */
__define_stab (N_LSYM, 0x80, "LSYM")
/* Beginning of an include file. Only Sun uses this.
In an object file, only the name is significant.
The Sun linker puts data into some of the other fields. */
__define_stab (N_BINCL, 0x82, "BINCL")
/* Name of sub-source file (#include file).
Value is starting text address of the compilation. */
__define_stab (N_SOL, 0x84, "SOL")
/* Parameter variable. Value is offset from argument pointer.
(On most machines the argument pointer is the same as the frame pointer. */
__define_stab (N_PSYM, 0xa0, "PSYM")
/* End of an include file. No name.
This and N_BINCL act as brackets around the file's output.
In an object file, there is no significant data in this entry.
The Sun linker puts data into some of the fields. */
__define_stab (N_EINCL, 0xa2, "EINCL")
/* Alternate entry point. Value is its address. */
__define_stab (N_ENTRY, 0xa4, "ENTRY")
/* Beginning of lexical block.
The desc is the nesting level in lexical blocks.
The value is the address of the start of the text for the block.
The variables declared inside the block *precede* the N_LBRAC symbol.
On Solaris2, the value is relative to the start of the current function. */
__define_stab (N_LBRAC, 0xc0, "LBRAC")
/* Place holder for deleted include file. Replaces a N_BINCL and everything
up to the corresponding N_EINCL. The Sun linker generates these when
it finds multiple identical copies of the symbols from an include file.
This appears only in output from the Sun linker. */
__define_stab (N_EXCL, 0xc2, "EXCL")
/* Modula-2 scope information. Can someone say what info it contains? */
__define_stab (N_SCOPE, 0xc4, "SCOPE")
/* End of a lexical block. Desc matches the N_LBRAC's desc.
The value is the address of the end of the text for the block.
On Solaris2, the value is relative to the start of the current function. */
__define_stab (N_RBRAC, 0xe0, "RBRAC")
/* Begin named common block. Only the name is significant. */
__define_stab (N_BCOMM, 0xe2, "BCOMM")
/* End named common block. Only the name is significant
(and it should match the N_BCOMM). */
__define_stab (N_ECOMM, 0xe4, "ECOMM")
/* Member of a common block; value is offset within the common block.
This should occur within a BCOMM/ECOMM pair. */
__define_stab (N_ECOML, 0xe8, "ECOML")
/* Solaris2: Pascal "with" statement: type,,0,0,offset */
__define_stab (N_WITH, 0xea, "WITH")
/* These STAB's are used on Gould systems for Non-Base register symbols
or something like that. FIXME. I have assigned the values at random
since I don't have a Gould here. Fixups from Gould folk welcome... */
__define_stab (N_NBTEXT, 0xF0, "NBTEXT")
__define_stab (N_NBDATA, 0xF2, "NBDATA")
__define_stab (N_NBBSS, 0xF4, "NBBSS")
__define_stab (N_NBSTS, 0xF6, "NBSTS")
__define_stab (N_NBLCS, 0xF8, "NBLCS")
/* Second symbol entry containing a length-value for the preceding entry.
The value is the length. */
__define_stab (N_LENG, 0xfe, "LENG")
/* The above information, in matrix format.
STAB MATRIX
_________________________________________________
| 00 - 1F are not dbx stab symbols |
| In most cases, the low bit is the EXTernal bit|
| 00 UNDEF | 02 ABS | 04 TEXT | 06 DATA |
| 01 |EXT | 03 |EXT | 05 |EXT | 07 |EXT |
| 08 BSS | 0A INDR | 0C FN_SEQ | 0E WEAKA |
| 09 |EXT | 0B | 0D WEAKU | 0F WEAKT |
| 10 WEAKD | 12 COMM | 14 SETA | 16 SETT |
| 11 WEAKB | 13 | 15 | 17 |
| 18 SETD | 1A SETB | 1C SETV | 1E WARNING|
| 19 | 1B | 1D | 1F FN |
|_______________________________________________|
| Debug entries with bit 01 set are unused. |
| 20 GSYM | 22 FNAME | 24 FUN | 26 STSYM |
| 28 LCSYM | 2A MAIN | 2C ROSYM | 2E |
| 30 PC | 32 NSYMS | 34 NOMAP | 36 |
| 38 OBJ | 3A | 3C OPT | 3E |
| 40 RSYM | 42 M2C | 44 SLINE | 46 DSLINE |
| 48 BSLINE*| 4A DEFD | 4C FLINE | 4E |
| 50 EHDECL*| 52 | 54 CATCH | 56 |
| 58 | 5A | 5C | 5E |
| 60 SSYM | 62 ENDM | 64 SO | 66 |
| 68 | 6A | 6C | 6E |
| 70 | 72 | 74 | 76 |
| 78 | 7A | 7C | 7E |
| 80 LSYM | 82 BINCL | 84 SOL | 86 |
| 88 | 8A | 8C | 8E |
| 90 | 92 | 94 | 96 |
| 98 | 9A | 9C | 9E |
| A0 PSYM | A2 EINCL | A4 ENTRY | A6 |
| A8 | AA | AC | AE |
| B0 | B2 | B4 | B6 |
| B8 | BA | BC | BE |
| C0 LBRAC | C2 EXCL | C4 SCOPE | C6 |
| C8 | CA | CC | CE |
| D0 | D2 | D4 | D6 |
| D8 | DA | DC | DE |
| E0 RBRAC | E2 BCOMM | E4 ECOMM | E6 |
| E8 ECOML | EA WITH | EC | EE |
| F0 | F2 | F4 | F6 |
| F8 | FA | FC | FE LENG |
+-----------------------------------------------+
* 50 EHDECL is also MOD2.
* 48 BSLINE is also BROWS.
*/
-67
View File
@@ -1,67 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
stab_gnu.h
Abstract:
HEADER, GNU stabs symbols
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.
--*/
#ifndef __GNU_STAB__
/* Indicate the GNU stab.h is in use. */
#define __GNU_STAB__
#define __define_stab(NAME, CODE, STRING) NAME=CODE,
#define __define_stab_duplicate(NAME, CODE, STRING) NAME=CODE,
enum __stab_debug_code
{
#include "stab.def"
LAST_UNUSED_STAB_CODE
};
#undef __define_stab
/* Definitions of "desc" field for N_SO stabs in Solaris2. */
#define N_SO_AS 1
#define N_SO_C 2
#define N_SO_ANSI_C 3
#define N_SO_CC 4 /* C++ */
#define N_SO_FORTRAN 5
#define N_SO_PASCAL 6
/* Solaris2: Floating point type values in basic types. */
#define NF_NONE 0
#define NF_SINGLE 1 /* IEEE 32-bit */
#define NF_DOUBLE 2 /* IEEE 64-bit */
#define NF_COMPLEX 3 /* Fortran complex */
#define NF_COMPLEX16 4 /* Fortran double complex */
#define NF_COMPLEX32 5 /* Fortran complex*16 */
#define NF_LDOUBLE 6 /* Long double (whatever that is) */
#endif /* __GNU_STAB_ */
File diff suppressed because it is too large Load Diff
-88
View File
@@ -1,88 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
symbols.h
Abstract:
HEADER for symbols.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.
--*/
typedef struct _LOCAL_VARIABLE
{
char type_name[64];
char name[64];
ULONG value,offset,line;
BOOLEAN bRegister;
}LOCAL_VARIABLE,*PLOCAL_VARIABLE;
struct _DEBUG_MODULE_SYMBOL_
{
ULONG value;
char* name;
};
typedef struct _DEBUG_MODULE_
{
struct _DEBUG_MODULE_ *next;
ULONG size;
PVOID BaseAddress;
PVOID EntryPoint;
WCHAR name[DEBUG_MODULE_NAME_LEN];
struct _DEBUG_MODULE_SYMBOL_ syms;
}DEBUG_MODULE, *PDEBUG_MODULE;
BOOLEAN InitFakeKernelModule(void);
BOOLEAN LoadExports(void);
BOOLEAN SanityCheckExports(void);
void UnloadExports(void);
BOOLEAN ScanExports(const char *pFind,PULONG pValue);
BOOLEAN ScanExportsByAddress(LPSTR *pFind,ULONG ulValue);
PICE_SYMBOLFILE_HEADER* LoadSymbols(LPSTR filename);
BOOLEAN LoadSymbolsFromConfig(BOOLEAN bIgnoreBootParams);
void UnloadSymbols(void);
BOOLEAN ReloadSymbols(void);
LPSTR FindFunctionByAddress(ULONG ulValue,PULONG pulstart,PULONG pulend);
LPSTR FindSourceLineForAddress(ULONG addr,PULONG pulLineNumber,LPSTR* ppSrcStart,LPSTR* ppSrcEnd,LPSTR* ppFilename);
PLOCAL_VARIABLE FindLocalsByAddress(ULONG addr);
ULONG FindFunctionInModuleByName(LPSTR szFunctionname, PDEBUG_MODULE pMod);
PICE_SYMBOLFILE_HEADER* FindModuleSymbolsByModuleName(LPSTR modname);
BOOLEAN FindAddressForSourceLine(ULONG ulLineNumber,LPSTR pFilename, PDEBUG_MODULE pMod,PULONG pValue);
ULONG ConvertDecimalToUlong(LPSTR p);
PDEBUG_MODULE FindModuleFromAddress(ULONG addr);
PICE_SYMBOLFILE_HEADER* FindModuleSymbols(ULONG addr);
ULONG ListSymbolStartingAt(PDEBUG_MODULE pMod,PICE_SYMBOLFILE_HEADER* pSymbols,ULONG index,LPSTR pOutput);
PDEBUG_MODULE FindModuleByName(LPSTR modname);
void Evaluate(PICE_SYMBOLFILE_HEADER* pSymbols,LPSTR p);
LONG ExtractNumber(LPSTR p);
LPSTR ExtractTypeName(LPSTR p);
PDEBUG_MODULE IsModuleLoaded(LPSTR p);
//extern ULONG kernel_end;
extern PICE_SYMBOLFILE_HEADER* apSymbols[32];
//extern struct module fake_kernel_module;
#define KERNEL_START (0xc0000000)
-231
View File
@@ -1,231 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
syscall.c
Abstract:
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
12-Nov-1999: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
char syscallTemp[1024];
typedef struct _FRAME_SYSCALL
{
ULONG eip;
ULONG cs;
ULONG eflags;
}FRAME_SYSCALL;
BOOLEAN bReportProcessEvents = TRUE;
ULONG OldSyscallHandler=0;
ULONG ulFreeModule=0;
PDEBUG_MODULE pModJustFreed=NULL;
void (*old_cleanup_module)(void)=NULL;
void other_module_cleanup_module(void)
{
DPRINT((0,"other_module_cleanup_module()\n"));
if(old_cleanup_module)
{
DPRINT((0,"other_module_cleanup_module(): calling %x\n",(ULONG)old_cleanup_module));
old_cleanup_module();
}
if(pModJustFreed)
{
DPRINT((0,"other_module_cleanup_module(): calling RevirtualizeBreakpointsForModule(%x)\n",(ULONG)pModJustFreed));
RevirtualizeBreakpointsForModule(pModJustFreed);
}
}
void CSyscallHandler(FRAME_SYSCALL* ptr,ULONG ulSysCall,ULONG ebx)
{
// DPRINT((0,"CSyscallHandler(): %.4X:%.8X (syscall = %u)\n",ptr->cs,ptr->eip,ulSysCall));
/*
switch(ulSysCall)
{
case 1: // sys_exit
DPRINT((0,"CSysCallHandler(): 1\n"));
if(bReportProcessEvents)
{
PICE_sprintf(syscallTemp,"pICE: process destroyed \"%s\" PID=%.4X\n",current->comm,current->pid);
AddToRingBuffer(syscallTemp);
}
break;
case 11: // sys_execve
DPRINT((0,"CSysCallHandler(): 11\n"));
if(bReportProcessEvents)
{
if(PICE_strlen((char*)ebx))
PICE_sprintf(syscallTemp,"pICE: process created \"%s\" PID=%.4X (parent \"%s\")\n",(char *)ebx,current->pid,current->comm);
else
PICE_sprintf(syscallTemp,"pICE: process created PID=%.4X (parent \"%s\")\n",current->pid,current->comm);
AddToRingBuffer(syscallTemp);
}
break;
case 128: // sys_init_module
DPRINT((0,"CSysCallHandler(): 128\n"));
if(PICE_strlen((char *)ebx))
{
if(pmodule_list)
{
struct module* pMod = *pmodule_list;
do
{
if(PICE_strcmpi((char*)ebx,(LPSTR)pMod->name)==0)
{
ULONG ulInitAddress;
PICE_sprintf(syscallTemp,"pICE: module \"%s\" loaded (%x-%x init @ %x)\n",(char*)ebx,pMod,(ULONG)pMod+pMod->size,pMod->init);
if((ulInitAddress=FindFunctionInModuleByName("init_module",pMod)))
{
DPRINT((0,"setting DR1=%.8x\n",ulInitAddress));
SetHardwareBreakPoint(ulInitAddress,1);
}
}
}while((pMod = pMod->next));
}
else
{
PICE_sprintf(syscallTemp,"pICE: module loaded \"%s\"\n",(char *)ebx);
}
}
else
PICE_sprintf(syscallTemp,"pICE: module loaded\n");
AddToRingBuffer(syscallTemp);
break;
case 129: // sys_delete_module
DPRINT((0,"CSysCallHandler(): 129\n"));
if(PICE_strlen((char *)ebx))
{
if(IsModuleLoaded((LPSTR)ebx)!=NULL && PICE_strcmpi((char*)ebx,"pice")!=0 )
{
PICE_sprintf(syscallTemp,"pICE: module freed \"%s\"\n",(char *)ebx);
Print(OUTPUT_WINDOW,syscallTemp);
if((pModJustFreed = FindModuleByName((char*)ebx)) )
{
if(pModJustFreed->cleanup)
{
old_cleanup_module = pModJustFreed->cleanup;
pModJustFreed->cleanup = other_module_cleanup_module;
}
else
{
RevirtualizeBreakpointsForModule(pModJustFreed);
}
}
}
}
else
{
PICE_sprintf(syscallTemp,"pICE: module freed\n");
AddToRingBuffer(syscallTemp);
}
break;
}
*/
}
__asm__ ("\n\t \
NewSyscallHandler:\n\t \
// save used regs\n\t \
pushfl\n\t \
cli\n\t \
cld\n\t \
pushal\n\t \
pushl %ds\n\t \
\n\t \
// push the syscall number\n\t \
pushl %ebx\n\t \
pushl %eax\n\t \
\n\t \
// frame ptr\n\t \
lea 48(%esp),%eax\n\t \
pushl %eax\n\t \
\n\t \
// setup default data selectors\n\t \
movw %ss,%ax\n\t \
movw %ax,%ds\n\t \
\n\t \
call _CSyscallHandler\n\t \
\n\t \
// remove pushed params\n\t \
add $12,%esp\n\t \
\n\t \
// restore used regs\n\t \
popl %ds\n\t \
popal\n\t \
popfl\n\t \
\n\t \
// chain to old handler\n\t \
.byte 0x2e\n\t \
jmp *_OldSyscallHandler");
void InstallSyscallHook(void)
{
ULONG LocalSyscallHandler;
ENTER_FUNC();
/*ei fix later
MaskIrqs();
if(!OldSyscallHandler)
{
__asm__("mov $NewSyscallHandler,%0"
:"=r" (LocalSyscallHandler)
:
:"eax");
OldSyscallHandler=SetGlobalInt(0x2e,(ULONG)LocalSyscallHandler);
ScanExports("free_module",(PULONG)&ulFreeModule);
DPRINT((0,"InstallSyscallHook(): free_module @ %x\n",ulFreeModule));
}
UnmaskIrqs();
*/
LEAVE_FUNC();
}
void DeInstallSyscallHook(void)
{
ENTER_FUNC();
/*ei
MaskIrqs();
if(OldSyscallHandler)
{
SetGlobalInt(0x2e,(ULONG)OldSyscallHandler);
(ULONG)OldSyscallHandler=0;
}
UnmaskIrqs();
*/
LEAVE_FUNC();
}
-35
View File
@@ -1,35 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
syscall.h
Abstract:
HEADER for syscall.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.
--*/
void InstallSyscallHook(void);
void DeInstallSyscallHook(void);
void CReturnFromSyscallHandler(void);
-91
View File
@@ -1,91 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
trace.c
Abstract:
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Revision History:
19-Aug-1998: created
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
extern void NewInt31Handler(void);
void DeInstallTraceHook(void);
volatile ULONG OldInt1Handler=0;
BOOLEAN InstallTraceHook(void)
{
ULONG LocalInt1Handler;
DPRINT((0,"InstallTraceHook(OldInt1Handler=%0.8x)...\n",OldInt1Handler));
MaskIrqs();
if(!OldInt1Handler)
{
__asm__("mov $NewInt1Handler,%0"
:"=r" (LocalInt1Handler)
:
:"eax");
OldInt1Handler=SetGlobalInt(0x01,(ULONG)LocalInt1Handler);
}
UnmaskIrqs();
return TRUE;
}
//this asm function must be at least second in the file. otherwise gcc does not
//generate correct code.
__asm__("\n\t \
NewInt1Handler:\n\t \
pushl %eax\n\t \
movl %dr6,%eax\n\t \
testl $(1<<14),%eax\n\t \
jz exceptionnotsinglestep\n\t \
\n\t \
popl %eax\n\t \
pushl $" STR(REASON_SINGLESTEP) "\n\t \
jmp NewInt31Handler\n\t \
\n\t \
exceptionnotsinglestep:\n\t \
popl %eax\n\t \
pushl $" STR(REASON_HARDWARE_BP) "\n\t \
jmp NewInt31Handler\n\t \
");
void DeInstallTraceHook(void)
{
DPRINT((0,"DeInstallTraceHook(OldInt1Handler=%0.8x)...\n",OldInt1Handler));
MaskIrqs();
if(OldInt1Handler)
{
SetGlobalInt(0x01,(ULONG)OldInt1Handler);
OldInt1Handler = 0;
}
UnmaskIrqs();
}
-35
View File
@@ -1,35 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
trace.h
Abstract:
HEADER for trace.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.
--*/
void DeInstallTraceHook(void);
BOOLEAN InstallTraceHook(void);
void NewInt1Handler(void);
extern volatile ULONG OldInt1Handler;
File diff suppressed because it is too large Load Diff
-325
View File
@@ -1,325 +0,0 @@
/*++
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
);
-572
View File
@@ -1,572 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
vga.c
Abstract:
VGA HW dependent draw routines
Environment:
Kernel mode only
Author:
Klaus P. Gerlicher
Reactos Port by Eugene Ingerman
Revision History:
04-Aug-1998: created
15-Nov-2000: general cleanup of source files
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
////////////////////////////////////////////////////
// INCLUDES
////
#include "remods.h"
#include "precomp.h"
//#include <asm/io.h>
//#include <linux/ctype.h>
////////////////////////////////////////////////////
// PROTOTYPES
////
extern void pice_save_current_registers(void);
extern void pice_restore_current_registers(void);
extern void pice_set_mode_3_80x50(void);
extern void pice_set_mode_3_80x25(void);
extern UCHAR cGraphTable[8*256];
// storage for original VGA font
UCHAR cGraphTable2[16*256];
////////////////////////////////////////////////////
// DEFINES
////
#define VGA_EXTENDED // define this for 80x50 console mode
#ifndef VGA_EXTENDED
#define SCREEN_BUFFER_SIZE (80*25*2)
#else
#define SCREEN_BUFFER_SIZE (80*50*2)
#endif
/* Port addresses of control regs */
#define MISCOUTPUT 0x3c2
#define FEATURECONTROL 0x3da
#define SEQUENCER 0x3c4
#define CRTC 0x03d4
#define GRAPHICS 0x3ce
#define ATTRIBS 0x03c0
#define PELADDRESSWRITE 0x3c8
#define PELDATAREG 0x3c9
/* Number of regs on the various controllers */
#define MAXSEQ 5
#define MAXCRTC 0x19
#define MAXGRAPH 0x9
#define MAXATTRIB 0x015
////////////////////////////////////////////////////
// GLOBALS
////
// used for HERCULES text and VGA text mode
WINDOW wWindowVga[4]=
#ifndef VGA_EXTENDED
{
{1,3,1,0,FALSE},
{5,4,1,0,FALSE},
{10,9,1,0,FALSE},
{20,4,1,0,FALSE}
};
#else // VGA_EXTENDED
{
{1,3,1,0,FALSE},
{5,4,1,0,FALSE},
{10,24,1,0,FALSE},
{35,14,1,0,FALSE}
};
#endif // VGA_EXTENDED
PUCHAR pScreenBufferVga;
PUCHAR pScreenBufferSaveVga = NULL;
PUCHAR pScreenBufferTempVga;
PUCHAR pScreenBufferHardwareVga;
PUCHAR pFontBufferVga = NULL;
UCHAR offset_a = 0;
UCHAR offset_c = 0,offset_d = 0;
UCHAR offset_e = 0,offset_f = 0;
struct _attr
{
union
{
struct
{
UCHAR fgcol : 4;
UCHAR bkcol : 3;
UCHAR blink : 1;
}bits;
UCHAR Asuchar;
}u;
}attr;
unsigned char oldgraphicsmode;
unsigned char oldgraphicsmisc;
unsigned char oldsqregmapmask;
unsigned char oldsqregmemory;
unsigned char oldgraphicssetresetenable;
unsigned char oldgraphicsreadmapsel;
unsigned char read_vga_reg(int port, int reg)
{
outportb(port,reg);
return(inportb(port+1));
}
void write_vga_reg(int port, unsigned char reg, unsigned char value)
{
outportb(port,reg);
outportb(port+1,value);
}
/* Registers within controllers */
#define VREND 0x11
#define GRREGSETRESET 0
#define GRREGENABLESETRESET 1
#define GRREGREADMAPSEL 4
#define SQREGMAPMASK 2
#define SQREGMEMORY 4
#define GRREGWRMODE 5
#define GRREGMISC 6
void map_font_memory(void)
{
oldgraphicssetresetenable = read_vga_reg(GRAPHICS, GRREGENABLESETRESET);
oldgraphicsmode = read_vga_reg(GRAPHICS, GRREGWRMODE);
oldgraphicsmisc = read_vga_reg(GRAPHICS, GRREGMISC);
oldgraphicsreadmapsel = read_vga_reg(GRAPHICS, GRREGREADMAPSEL);
oldsqregmapmask = read_vga_reg(SEQUENCER, SQREGMAPMASK);
oldsqregmemory = read_vga_reg(SEQUENCER, SQREGMEMORY);
/* Make sure set/reset enable is off */
write_vga_reg(GRAPHICS,GRREGENABLESETRESET,0);
/* Select read plane 2 */
write_vga_reg(GRAPHICS,GRREGREADMAPSEL,0x02);
/* Make sure write and read mode = 0 */
write_vga_reg(GRAPHICS,GRREGWRMODE,0x00);
/* Set mapping to 64K at a000:0 & turn off odd/even at the graphics reg */
write_vga_reg(GRAPHICS,GRREGMISC, 0x04);
/* Set sequencer plane to 2 */
write_vga_reg(SEQUENCER,SQREGMAPMASK, 0x04);
/* Turn off odd/even at the sequencer */
write_vga_reg(SEQUENCER,SQREGMEMORY, 0x07);
}
void unmap_font_memory(void)
{
write_vga_reg(GRAPHICS,GRREGENABLESETRESET,oldgraphicssetresetenable);
write_vga_reg(GRAPHICS,GRREGWRMODE,oldgraphicsmode);
write_vga_reg(GRAPHICS,GRREGREADMAPSEL,oldgraphicsreadmapsel);
write_vga_reg(GRAPHICS,GRREGMISC, oldgraphicsmisc);
write_vga_reg(SEQUENCER,SQREGMAPMASK, oldsqregmapmask);
write_vga_reg(SEQUENCER,SQREGMEMORY, oldsqregmemory);
}
/* Font and palette constants */
#define BYTESPERFONT 8
#define FONTENTRIES 256
#define FONTBUFFERSIZE 8192
void save_font(UCHAR* graph_table)
{
PUCHAR FontBase = pFontBufferVga;
int i,j;
map_font_memory();
for (i=0; i < FONTENTRIES; i++)
for (j=0; j < 16; j++)
graph_table[i*16+j] = FontBase[i*32+j];
unmap_font_memory();
}
void load_font(UCHAR* graph_table,int bEnter)
{
PUCHAR FontBase = pFontBufferVga;
int i,j;
map_font_memory();
if(bEnter)
{
#ifdef VGA_EXTENDED
for (i=0; i < FONTENTRIES; i++)
for (j=0; j < 8; j++)
FontBase[i*32+j] = graph_table[i*BYTESPERFONT+j];
#else // VGA_EXTENDED
for (i=0; i < FONTENTRIES; i++)
for (j=0; j < 16; j++)
FontBase[i*32+j] = graph_table[i*BYTESPERFONT+(j/2)] << (j&1);
#endif // VGA_EXTENDED
}
else
{
for (i=0; i < FONTENTRIES; i++)
for (j=0; j < 16; j++)
FontBase[i*32+j] = graph_table[i*16+j];
}
unmap_font_memory();
}
//*************************************************************************
// SetForegroundColorVga()
//
//*************************************************************************
void SetForegroundColorVga(ECOLORS col)
{
attr.u.bits.fgcol = col;
attr.u.bits.blink = 0;
}
//*************************************************************************
// SetBackgroundColorVga()
//
//*************************************************************************
void SetBackgroundColorVga(ECOLORS col)
{
attr.u.bits.bkcol = col;
attr.u.bits.blink = 0;
}
//*************************************************************************
// PrintGrafVga()
//
//*************************************************************************
void PrintGrafVga(ULONG x,ULONG y,UCHAR c)
{
((PUSHORT)pScreenBufferVga)[y*GLOBAL_SCREEN_WIDTH + x] = (USHORT)((attr.u.Asuchar<<8)|c);
}
//*************************************************************************
// ShowCursor()
//
// show hardware cursor
//*************************************************************************
void ShowCursorVga(void)
{
ENTER_FUNC();
bCursorEnabled=TRUE;
outb_p(0x0a,0x3d4);
outb_p(inb_p(0x3d5)&~0x20,0x3d5);
LEAVE_FUNC();
}
//*************************************************************************
// HideCursorVga()
//
// hide hardware cursor
//*************************************************************************
void HideCursorVga(void)
{
ENTER_FUNC();
bCursorEnabled=FALSE;
outb_p(0x0a,0x3d4);
outb_p(inb_p(0x3d5)|0x20,0x3d5);
LEAVE_FUNC();
}
//*************************************************************************
// CopyLineTo()
//
// copy a line from src to dest
//*************************************************************************
void CopyLineToVga(USHORT dest,USHORT src)
{
PUSHORT p = (PUSHORT)pScreenBufferVga;
ENTER_FUNC();
PICE_memcpy(&p[dest*GLOBAL_SCREEN_WIDTH],&p[src*GLOBAL_SCREEN_WIDTH],GLOBAL_SCREEN_WIDTH*sizeof(USHORT));
LEAVE_FUNC();
}
//*************************************************************************
// InvertLineVga()
//
// invert a line on the screen
//*************************************************************************
void InvertLineVga(ULONG line)
{
ULONG i;
PUSHORT p = (PUSHORT)pScreenBufferVga;
USHORT attr;
if(line < GLOBAL_SCREEN_HEIGHT)
{
attr = p[line*GLOBAL_SCREEN_WIDTH]>>8;
attr = ((attr & 0x07)<<4) | ((attr & 0xF0)>>4);
attr <<= 8;
for(i=0;i<GLOBAL_SCREEN_WIDTH;i++)
p[line*GLOBAL_SCREEN_WIDTH + i] = (p[line*GLOBAL_SCREEN_WIDTH + i] & 0x00FF) | attr;
}
}
//*************************************************************************
// HatchLineVga()
//
// hatches a line on the screen
//*************************************************************************
void HatchLineVga(ULONG line)
{
ULONG i;
PUSHORT p = (PUSHORT)pScreenBufferVga;
if(line < GLOBAL_SCREEN_HEIGHT)
{
for(i=0;i<GLOBAL_SCREEN_WIDTH;i++)
p[line*GLOBAL_SCREEN_WIDTH + i] = (p[line*GLOBAL_SCREEN_WIDTH + i] & 0xF0FF) | 0x0c00;
}
}
//*************************************************************************
// ClrLineVga()
//
// clear a line on the screen
//*************************************************************************
void ClrLineVga(ULONG line)
{
ULONG i;
PUSHORT p = (PUSHORT)pScreenBufferVga;
if(line < GLOBAL_SCREEN_HEIGHT)
{
for(i=0;i<GLOBAL_SCREEN_WIDTH;i++)
p[line*GLOBAL_SCREEN_WIDTH + i] = (USHORT)((attr.u.Asuchar<<8) | 0x20);
}
}
//*************************************************************************
// PrintLogoVga()
//
//*************************************************************************
void PrintLogoVga(BOOLEAN bShow)
{
NOT_IMPLEMENTED();
}
//*************************************************************************
// PrintCursorVga()
//
// emulate a blinking cursor block
//*************************************************************************
void PrintCursorVga(BOOLEAN bForce)
{
static ULONG count=0;
USHORT charoffset;
UCHAR data;
ULONG x=wWindow[OUTPUT_WINDOW].usCurX,y=wWindow[OUTPUT_WINDOW].y+wWindow[OUTPUT_WINDOW].usCurY;
if( count++>250 )
{
count=0;
charoffset = (y* GLOBAL_SCREEN_WIDTH + x);
outb_p(0x0e,0x3d4);
data=(UCHAR)((charoffset>>8)&0xFF);
outb_p(data,0x3d5);
outb_p(0x0f,0x3d4);
data=(UCHAR)(charoffset & 0xFF);
outb_p(data,0x3d5);
}
}
//*************************************************************************
// SaveGraphicsVga()
//
//*************************************************************************
void SaveGraphicsStateVga(void)
{
UCHAR data;
// save current regs
pice_save_current_registers();
// unprotect crtc regs 0-7
outb_p(0x11,0x3d4);
data = inb_p(0x3d5);
outb_p(data & 0x7F,0x3d5);
// save current font
save_font(cGraphTable2);
// restore original regs
#ifdef VGA_EXTENDED
pice_set_mode_3_80x50();
#else
pice_set_mode_3_80x25();
#endif
// load a font
load_font(cGraphTable,1);
// copy the screen content to temp area
PICE_memcpy(pScreenBufferTempVga,pScreenBufferHardwareVga,SCREEN_BUFFER_SIZE);
// copy the console to the screen
PICE_memcpy(pScreenBufferHardwareVga,pScreenBufferVga,SCREEN_BUFFER_SIZE);
// save original pointer
pScreenBufferSaveVga = pScreenBufferVga;
// pScreenBufferVga now points to screen
pScreenBufferVga = pScreenBufferHardwareVga;
}
//*************************************************************************
// RestoreGraphicsStateVga()
//
//*************************************************************************
void RestoreGraphicsStateVga(void)
{
UCHAR data;
// unprotect crtc regs 0-7
outb_p(0x11,0x3d4);
data = inb_p(0x3d5);
outb_p(data & 0x7F,0x3d5);
// restore original regs
pice_restore_current_registers();
// load a font
load_font(cGraphTable2,0);
pScreenBufferVga = pScreenBufferSaveVga;
// copy screen to the console
PICE_memcpy(pScreenBufferVga,pScreenBufferHardwareVga,SCREEN_BUFFER_SIZE);
// copy the temp area to the screen
PICE_memcpy(pScreenBufferHardwareVga,pScreenBufferTempVga,SCREEN_BUFFER_SIZE);
}
//*************************************************************************
// ConsoleInitVga()
//
// init terminal screen
//*************************************************************************
BOOLEAN ConsoleInitVga(void)
{
BOOLEAN bResult = FALSE;
PUSHORT p;
PHYSICAL_ADDRESS FrameBuffer;
PHYSICAL_ADDRESS FontBuffer;
ENTER_FUNC();
ohandlers.CopyLineTo = CopyLineToVga;
ohandlers.PrintGraf = PrintGrafVga;
ohandlers.ClrLine = ClrLineVga;
ohandlers.InvertLine = InvertLineVga;
ohandlers.HatchLine = HatchLineVga;
ohandlers.PrintLogo = PrintLogoVga;
ohandlers.PrintCursor = PrintCursorVga;
ohandlers.SaveGraphicsState = SaveGraphicsStateVga;
ohandlers.RestoreGraphicsState = RestoreGraphicsStateVga;
ohandlers.ShowCursor = ShowCursorVga;
ohandlers.HideCursor = HideCursorVga;
ohandlers.SetForegroundColor = SetForegroundColorVga;
ohandlers.SetBackgroundColor = SetBackgroundColorVga;
ihandlers.GetKeyPolled = KeyboardGetKeyPolled;
ihandlers.FlushKeyboardQueue = KeyboardFlushKeyboardQueue;
SetWindowGeometry(wWindowVga);
GLOBAL_SCREEN_WIDTH = 80;
#ifndef VGA_EXTENDED
GLOBAL_SCREEN_HEIGHT = 25;
#else // VGA_EXTENDED
GLOBAL_SCREEN_HEIGHT = 50;
#endif // VGA_EXTENDED
attr.u.Asuchar = 0x07;
// the real framebuffer
FrameBuffer.u.LowPart = 0xB8000;
pScreenBufferHardwareVga = MmMapIoSpace(FrameBuffer,SCREEN_BUFFER_SIZE,MmNonCached);
//The real font buffer
FontBuffer.u.LowPart = 0xA0000;
pFontBufferVga = MmMapIoSpace(FontBuffer,FONTBUFFERSIZE,MmNonCached);
// the console
pScreenBufferVga = PICE_malloc(SCREEN_BUFFER_SIZE,NONPAGEDPOOL);
// the save area
pScreenBufferTempVga = PICE_malloc(SCREEN_BUFFER_SIZE,NONPAGEDPOOL);
if(pScreenBufferVga)
{
DPRINT((0,"VGA memory phys. 0x000b0000 mapped to virt. 0x%x\n",pScreenBufferVga));
bResult = TRUE;
p = (PUSHORT)pScreenBufferVga;
PICE_memset(pScreenBufferVga,0x0,SCREEN_BUFFER_SIZE);
DPRINT((0,"VGA memory cleared!\n"));
EmptyRingBuffer();
DPRINT((0,"ConsoleInitVga() SUCCESS!\n"));
}
LEAVE_FUNC();
return bResult;
}
//*************************************************************************
// ConsoleShutdownVga()
//
// exit terminal screen
//*************************************************************************
void ConsoleShutdownVga(void)
{
ENTER_FUNC();
if(pScreenBufferVga)
{
PICE_free(pScreenBufferVga);
PICE_free(pScreenBufferTempVga);
MmUnmapIoSpace(pScreenBufferHardwareVga,SCREEN_BUFFER_SIZE);
MmUnmapIoSpace(pFontBufferVga,FONTBUFFERSIZE);
}
LEAVE_FUNC();
}
-32
View File
@@ -1,32 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
vga.h
Abstract:
HEADER for vga.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.
--*/
BOOLEAN ConsoleInitVga(void);
void ConsoleShutdownVga(void);
@@ -1,729 +0,0 @@
;/*++
;
;Copyright (c) 1998-2001 Klaus P. Gerlicher
;
;Module Name:
;
; vga_utils.asm
;
;Abstract:
;
; assembler function for directly programming standard VGA
;
;Environment:
;
; LINUX 2.2.X
; Kernel mode only
;
;Author:
;
; Klaus P. Gerlicher
; Reactos Port by Eugene Ingerman
;
;Revision History:
;
; 30-Oct-2001: created
;
;Copyright notice:
;
; This file may be distributed under the terms of the GNU Public License.
;
;--*/
global _pice_save_current_registers
global _pice_restore_current_registers
global _pice_set_mode_3_80x50
global _pice_set_mode_3_80x25
;****************************************************************************
;* some assign's ************************************************************
;****************************************************************************
%assign VGA_CRT_REGISTERS 24
%assign VGA_ATTRIBUTE_REGISTERS 21
%assign VGA_GRAPHIC_REGISTERS 9
%assign VGA_SEQUENCER_REGISTERS 5
%assign VGA_MISC_REGISTERS 1
%assign VGA_IO_BASE 03c0h
%assign VGA_IO_SIZE 020h
%assign VGA_ATTRIBUTE_INDEX 03c0h
%assign VGA_ATTRIBUTE_DATA_WRITE 03c0h
%assign VGA_ATTRIBUTE_DATA_READ 03c1h
%assign VGA_MISC_DATA_WRITE 03c2h
%assign VGA_SEQUENCER_INDEX 03c4h
%assign VGA_SEQUENCER_DATA 03c5h
%assign VGA_PEL_MASK 03c6h
%assign VGA_PEL_INDEX_READ 03c7h
%assign VGA_PEL_INDEX_WRITE 03c8h
%assign VGA_PEL_DATA 03c9h
%assign VGA_MISC_DATA_READ 03cch
%assign VGA_GRAPHIC_INDEX 03ceh
%assign VGA_GRAPHIC_DATA 03cfh
%assign VGA_CRT_INDEX 03d4h
%assign VGA_CRT_DATA 03d5h
%assign VGA_INPUT_STATUS 03dah
section .data
pice_mode3_80x50_registers:
; offsets 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18
.crt: db 0x5f,0x4f,0x50,0x82,0x55,0x80,0xbf,0x1f,0x00,0x67,0x06,0x07,0x00,0x00,0x00,0x00,0x9c,0x8f,0x8f,0x28,0x1f,0x96,0xb9,0xa3,0xff
.attribute db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x08,0x00,0x0f,0x00,0x00
.graphic: db 0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0xff
.sequencer: db 0x03,0x00,0x03,0x00,0x02 ; 9 bits per char
;.sequencer: db 0x03,0x01,0x03,0x00,0x02 ; 8 bits per char
.misc: db 0x67
pice_mode3_80x25_registers:
; offsets 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18
.crt: db 0x5f,0x4f,0x50,0x82,0x55,0x81,0xbf,0x1f,0x00,0x4f,0x0d,0x0e,0x00,0x00,0x30,0xe8,0x9c,0x0e,0x8f,0x28,0x1f,0x96,0xb9,0xa3
.attribute db 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x0c,0x00,0x0f,0x08,0x00
.graphic: db 0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0xff
.sequencer: db 0x03,0x00,0x03,0x00,0x02
.misc: db 0x67
section .bss
pice_current_registers:
.crt: resb VGA_CRT_REGISTERS
.attribute: resb VGA_ATTRIBUTE_REGISTERS
.graphic: resb VGA_GRAPHIC_REGISTERS
.sequencer: resb VGA_SEQUENCER_REGISTERS
.misc: resb VGA_MISC_REGISTERS
align 4
.colormap: resd 256
;****************************************************************************
;* pice_save_current_charset ************************************************
;****************************************************************************
section .text
pice_address dd 0xc00a0000
pice_save_current_charset:
xor dword ebx, ebx
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, pice_charset_saved
cld
rep movsd
mov dword ebx, 00100h
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, (pice_charset_saved + 010000h)
cld
rep movsd
mov dword ebx, 00200h
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, (pice_charset_saved + 020000h)
cld
rep movsd
mov dword ebx, 00300h
call pice_select_read_plane
mov dword ecx, 04000h
mov dword esi, [pice_address]
mov dword edi, (pice_charset_saved + 030000h)
cld
rep movsd
.end: ret
;****************************************************************************
;* pice_restore_current_charset ****************************************************
;****************************************************************************
section .text
pice_restore_current_charset:
mov dword ebx, 00100h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, pice_charset_saved
mov dword edi, [pice_address]
cld
rep movsd
mov dword ebx, 00200h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, (pice_charset_saved + 010000h)
mov dword edi, [pice_address]
cld
rep movsd
mov dword ebx, 00400h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, (pice_charset_saved + 020000h)
mov dword edi, [pice_address]
cld
rep movsd
mov dword ebx, 00800h
call pice_select_write_plane
mov dword ecx, 04000h
mov dword esi, (pice_charset_saved + 030000h)
mov dword edi, [pice_address]
cld
rep movsd
.end: ret
;****************************************************************************
;* pice_get_crt_registers **************************************************
;****************************************************************************
;* ebx=> pointer where to store crt registers
;****************************************************************************
section .text
pice_get_crt_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_CRT_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_CRT_DATA
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_CRT_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_attribute_registers ********************************************
;****************************************************************************
;* ebx=> pointer where to store attribute registers
;****************************************************************************
section .text
pice_get_attribute_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_INPUT_STATUS
in byte al, dx
mov dword edx, VGA_ATTRIBUTE_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_ATTRIBUTE_DATA_READ
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_ATTRIBUTE_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_graphic_registers **********************************************
;****************************************************************************
;* ebx=> pointer where to store graphics registers
;****************************************************************************
section .text
pice_get_graphic_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_GRAPHIC_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_sequencer_registers ********************************************
;****************************************************************************
;* ebx=> pointer where to store sequencer registers
;****************************************************************************
section .text
pice_get_sequencer_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
in byte al, dx
mov byte [ebx + ecx], al
inc dword ecx
cmp dword ecx, VGA_SEQUENCER_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_get_misc_registers *************************************************
;****************************************************************************
;* ebx=> pointer where to store misc register
;****************************************************************************
section .text
pice_get_misc_registers:
mov dword edx, VGA_MISC_DATA_READ
in byte al, dx
mov byte [ebx], al
ret
;****************************************************************************
;* pice_get_colormap *******************************************************
;****************************************************************************
;* ebx=> pointer where to store colormap
;****************************************************************************
section .text
pice_get_colormap:
xor dword ecx, ecx
xor dword eax, eax
mov dword edx, VGA_PEL_INDEX_READ
out word dx, al
mov dword edx, VGA_PEL_DATA
.loop: in byte al, dx
shl dword eax, 8
in byte al, dx
shl dword eax, 8
in byte al, dx
mov dword [ebx + 4 * ecx], eax
inc dword ecx
test byte cl, cl
jnz .loop
ret
;****************************************************************************
;* pice_set_crt_registers **************************************************
;****************************************************************************
;* ebx=> pointer to stored crt registers
;****************************************************************************
section .text
pice_set_crt_registers:
;deprotect CRT registers 0 - 7
mov dword edx, VGA_CRT_INDEX
mov byte al, 011h
out word dx, al
mov dword edx, VGA_CRT_DATA
in byte al, dx
and byte al, 07fh
out word dx, al
;write to the registers
xor dword ecx, ecx
.loop: mov dword edx, VGA_CRT_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_CRT_DATA
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_CRT_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_set_attribute_registers ********************************************
;****************************************************************************
;* ebx=> pointer to stored attibute registers
;****************************************************************************
section .text
pice_set_attribute_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_INPUT_STATUS
in byte al, dx
mov dword edx, VGA_ATTRIBUTE_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_ATTRIBUTE_DATA_WRITE
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_ATTRIBUTE_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_set_graphic_registers **********************************************
;****************************************************************************
;* ebx=> pointer to stored graphic registers
;****************************************************************************
section .text
pice_set_graphic_registers:
xor dword ecx, ecx
.loop: mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_GRAPHIC_REGISTERS
jb .loop
ret
;****************************************************************************
;* pice_set_sequencer_registers ********************************************
;****************************************************************************
;* ebx=> pointer to stored sequencer registers
;****************************************************************************
section .text
pice_set_sequencer_registers:
;synchronous reset on
mov dword edx, VGA_SEQUENCER_INDEX
xor dword eax, eax
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
inc dword eax
out word dx, al
;write to the registers
mov dword edx, VGA_SEQUENCER_INDEX
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, [ebx + 1]
or byte al, 020h
out word dx, al
mov dword ecx, 2
.loop: mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, cl
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, [ebx + ecx]
out word dx, al
inc dword ecx
cmp dword ecx, VGA_SEQUENCER_REGISTERS
jb .loop
;synchronous reset off
mov dword edx, VGA_SEQUENCER_INDEX
xor dword eax, eax
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, 3
out word dx, al
ret
;****************************************************************************
;* pice_set_misc_registers *************************************************
;****************************************************************************
;* ebx=> pointer to stored misc register
;****************************************************************************
section .text
pice_set_misc_registers:
mov dword edx, VGA_MISC_DATA_WRITE
mov byte al, [ebx]
out word dx, al
ret
;****************************************************************************
;* pice_set_colormap *******************************************************
;****************************************************************************
;* ebx=> pointer to stored colormap
;****************************************************************************
section .text
pice_set_colormap:
xor dword ecx, ecx
xor dword eax, eax
mov dword edx, VGA_PEL_INDEX_WRITE
out word dx, al
mov dword edx, VGA_PEL_DATA
.loop: mov dword eax, [ebx + 4 * ecx]
rol dword eax, 16
out word dx, al
rol dword eax, 8
out word dx, al
rol dword eax, 8
out word dx, al
inc dword ecx
test byte cl, cl
jnz .loop
ret
;****************************************************************************
;* pice_screen_on **********************************************************
;****************************************************************************
section .text
pice_screen_on:
;turn on the screen
mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, 1
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
in byte al, dx
and byte al, 0dfh
out word dx, al
;enable video output
mov dword edx, VGA_INPUT_STATUS
in byte al, dx
mov dword edx, VGA_ATTRIBUTE_DATA_WRITE
mov byte al, 020h
out word dx, al
ret
;****************************************************************************
;* pice_select_write_plane *************************************************
;****************************************************************************
;* bl==> write mode
;* bh==> write plane
;****************************************************************************
section .text
pice_select_write_plane:
and dword ebx, 00f03h
;enable set/reset = 0
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 1
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
xor dword eax, eax
out word dx, al
;logical operation = none, rotate = 0
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 3
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
xor dword eax, eax
out word dx, al
;select write mode
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 5
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
in byte al, dx
and byte al, 0fch
or byte al, bl
out word dx, al
;bitmask = 0ffh
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 8
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
mov byte al, 0ffh
out word dx, al
;select write plane
mov dword edx, VGA_SEQUENCER_INDEX
mov byte al, 2
out word dx, al
mov dword edx, VGA_SEQUENCER_DATA
mov byte al, bh
out word dx, al
ret
;****************************************************************************
;* pice_select_read_plane **************************************************
;****************************************************************************
;* bl==> read mode
;* bh==> read plane
;****************************************************************************
section .text
pice_select_read_plane:
and dword ebx, 00301h
shl byte bl, 3
;select read mode
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 5
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
in byte al, dx
and byte al, 0f7h
or byte al, bl
out word dx, al
;select read plane
mov dword edx, VGA_GRAPHIC_INDEX
mov byte al, 4
out word dx, al
mov dword edx, VGA_GRAPHIC_DATA
mov byte al, bh
out word dx, al
ret
;****************************************************************************
;* pice_save_current_registers **********************************************
;****************************************************************************
section .text
_pice_save_current_registers:
push esi
push edi
push ebx
; call pice_save_current_charset
.crt: mov dword ebx, pice_current_registers.crt
call pice_get_crt_registers
.attribute: mov dword ebx, pice_current_registers.attribute
call pice_get_attribute_registers
.graphic: mov dword ebx, pice_current_registers.graphic
call pice_get_graphic_registers
.sequencer: mov dword ebx, pice_current_registers.sequencer
call pice_get_sequencer_registers
.misc: mov dword ebx, pice_current_registers.misc
call pice_get_misc_registers
.colormap: mov dword ebx, pice_current_registers.colormap
call pice_get_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* pice_restore_current_registers *******************************************
;****************************************************************************
section .text
_pice_restore_current_registers:
push esi
push edi
push ebx
; call pice_restore_current_charset
.misc: mov dword ebx, pice_current_registers.misc
call pice_set_misc_registers
.crt: mov dword ebx, pice_current_registers.crt
call pice_set_crt_registers
.attribute: mov dword ebx, pice_current_registers.attribute
call pice_set_attribute_registers
.graphic: mov dword ebx, pice_current_registers.graphic
call pice_set_graphic_registers
.sequencer: mov dword ebx, pice_current_registers.sequencer
call pice_set_sequencer_registers
.screen_on: call pice_screen_on
.colormap: mov dword ebx, pice_current_registers.colormap
call pice_set_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* pice_set_mode_3_80x50*****************************************************
;****************************************************************************
section .text
_pice_set_mode_3_80x50:
push esi
push edi
push ebx
.crt: mov dword ebx, pice_mode3_80x50_registers.crt
call pice_set_crt_registers
.attribute: mov dword ebx, pice_mode3_80x50_registers.attribute
call pice_set_attribute_registers
.graphic: mov dword ebx, pice_mode3_80x50_registers.graphic
call pice_set_graphic_registers
.sequencer: mov dword ebx, pice_mode3_80x50_registers.sequencer
call pice_set_sequencer_registers
.misc: mov dword ebx, pice_mode3_80x50_registers.misc
call pice_set_misc_registers
.screen_on: call pice_screen_on
;.colormap: mov dword ebx, pice_current_registers.colormap
; call pice_set_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* pice_set_mode_3_80x25*****************************************************
;****************************************************************************
section .text
_pice_set_mode_3_80x25:
push esi
push edi
push ebx
.crt: mov dword ebx, pice_mode3_80x25_registers.crt
call pice_set_crt_registers
.attribute: mov dword ebx, pice_mode3_80x25_registers.attribute
call pice_set_attribute_registers
.graphic: mov dword ebx, pice_mode3_80x25_registers.graphic
call pice_set_graphic_registers
.sequencer: mov dword ebx, pice_mode3_80x25_registers.sequencer
call pice_set_sequencer_registers
.misc: mov dword ebx, pice_mode3_80x25_registers.misc
call pice_set_misc_registers
.screen_on: call pice_screen_on
;.colormap: mov dword ebx, pice_current_registers.colormap
; call pice_set_colormap
pop ebx
pop edi
pop esi
.end: ret
;****************************************************************************
;* uninitialized data *******************************************************
;****************************************************************************
section .bss
alignb 4
pice_charset_saved: resb 040000h
-4
View File
@@ -1,4 +0,0 @@
# sample
+vga
\\SystemRoot\symbols\pice.dbg
\\SystemRoot\symbols\ntoskrnl.dbg
-107
View File
@@ -1,107 +0,0 @@
This is some preliminary information on using PICE. I am planning to write
a detailed manual later.
BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA
PICE for Reactos is in early beta stage of development. It still has many bugs.
BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA-BETA
PICE is a kernel debugger that was ported for Reactos (the original Linux
project by Klaus P. Gerlicher and Goran Devic may be found here:
http://pice.sourceforge.net).
Installation and use:
1. PICE is loaded like a regular device driver. The only limitation - it must
be loaded after keyboard.sys driver. You should add:
LdrLoadAutoConfigDriver( L"pice.sys" );
in ntoskrnl/ldr/loader.c after the line loading keyboard driver.
2. You should copy pice.cfg and ntoskrnl.sym to \SystemRoot\symbols directory
of Reactos.
3. If you want to add symbolic information you should use loader.exe to
create .dbg file from the unstrippped version of exe or driver:
For example:
pice\loader\loader.exe -t ntoskrnl.nostrip.exe
After that copy .dbg file to \SystemRoot\symbols and add a line to pice.cfg:
\\SystemRoot\symbols\ntoskrnl.dbg.
Pice will load the symbols during boot. For large .dbg files it may take a
while (ntoskrnl.dbg is ~3Mb). You may find that loading time under bochs is
quite slow, although otherwise performance should be fine.
Key combination to break into debugger is CTRL-D.
You may need to press CTRL button upon return from the debugger if you get
"funny" symbols when you type.
List of commands:
gdt display current global descriptor table
idt display current interrupt descriptor table
x return to Reactos
t single step one instruction
vma displays VMAs
h list help on commands
page dump page directories
proc list all processes
dd display dword memory
db display byte memory
u disassemble at address
mod displays all modules
bpx set code breakpoint
bl list breakpoints
bc clear breakpoints
ver display pICE version and state information
hboot hard boot the system
cpu display CPU special registers
stack display call stack
. unassemble at current instruction
p single step over call
i single step into call
locals display local symbols
table display loaded symbol tables
file display source files in symbol table
sym list known symbol information
? evaluate an expression (global symbols only)
src sets disassembly mode
wc change size of code window
wd change size of data window
r sets or displays registers
cls clear output window
pci show PCI devices
next advance EIP to next instruction
i3here catch INT 3s
layout sets keyboard layout
syscall displays syscall (table)
altkey set alternate break key
addr show/set address contexts
[CTRL/SHIFT/ALT] arrow up/down
TAB
Not implemented yet:
dpd display dword physical memory
code toggle code display
peek peek at physical memory
poke poke to physical memory
phys show all mappings for linear address
timers show all active timers
TODO:
1. Evaluation of pointers.
2. Virtual breakpoints
3. Unimplemented commands.
4. Video mode switching (to debug gdi applications).
Enjoy,
Eugene
-204
View File
@@ -1,204 +0,0 @@
/*++
Copyright (c) 1998-2001 Klaus P. Gerlicher
Module Name:
shared.h
Abstract:
shared stuff between module and loader
Environment:
LINUX 2.2.X
Kernel mode only
Author:
Klaus P. Gerlicher
reactos port by:
Eugene Ingerman
Revision History:
13-Nov-1999: created
15-Nov-2000: general cleanup of source files
10/20/2001: porting to reactos begins
Copyright notice:
This file may be distributed under the terms of the GNU Public License.
--*/
//#include <ntddk.h>
//#include <winnt.h>
//temporary
#ifndef CTL_CODE
#define CTL_CODE(Dev, Func, Meth, Acc) ( ((Dev)<<16) | ((Acc)<<14) | ((Func)<<2) | (Meth))
// IOCTL Parameter buffering methods
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
// IOCTL File access type
#define FILE_ANY_ACCESS 0
#define FILE_READ_ACCESS 1
#define FILE_WRITE_ACCESS 2
#endif
// define custom device type
#define PICE_DEVICE_DEBUGGER 64787
#define PICE_IOCTL_LOAD CTL_CODE(PICE_DEVICE_DEBUGGER, 2049, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define PICE_IOCTL_UNLOAD CTL_CODE(PICE_DEVICE_DEBUGGER, 2050, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define PICE_IOCTL_RELOAD CTL_CODE(PICE_DEVICE_DEBUGGER, 2051, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define PICE_IOCTL_BREAK CTL_CODE(PICE_DEVICE_DEBUGGER, 2052, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define PICE_IOCTL_STATUS CTL_CODE(PICE_DEVICE_DEBUGGER, 2053, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _DEBUGGER_STATUS_BLOCK
{
char filename[256];
}DEBUGGER_STATUS_BLOCK,*PDEBUGGER_STATUS_BLOCK;
#define MAGIC_ULONG( ch0, ch1, ch2, ch3 ) \
( (ULONG)(UCHAR)(ch0) | \
( (ULONG)(UCHAR)(ch1) << 8 ) | \
( (ULONG)(UCHAR)(ch2) << 16 ) | \
( (ULONG)(UCHAR)(ch3) << 24 ) )
#define PICE_MAGIC MAGIC_ULONG('P','I','C','E')
#define DEBUG_MODULE_NAME_LEN 32
typedef struct _PICE_SYMBOLFILE_HEADER
{
ULONG magic;
WCHAR name[DEBUG_MODULE_NAME_LEN];
ULONG ulOffsetToHeaders,ulSizeOfHeader;
ULONG ulOffsetToGlobals,ulSizeOfGlobals;
ULONG ulOffsetToGlobalsStrings,ulSizeOfGlobalsStrings;
ULONG ulOffsetToStabs,ulSizeOfStabs;
ULONG ulOffsetToStabsStrings,ulSizeOfStabsStrings;
ULONG ulOffsetToSrcFiles,ulNumberOfSrcFiles;
}PICE_SYMBOLFILE_HEADER;
typedef struct _STAB_ENTRY
{
unsigned long n_strx;
unsigned char n_type;
unsigned char n_other;
unsigned short n_desc;
unsigned long n_value;
}STAB_ENTRY,*PSTAB_ENTRY;
typedef struct _PICE_SYMBOLFILE_SOURCE
{
char filename[256];
ULONG ulOffsetToNext;
}PICE_SYMBOLFILE_SOURCE;
///////////////////////////////////////////////////////////////////////////////////
// serial stuff
typedef struct _SERIAL_PACKET_HEADER
{
ULONG packet_size;
ULONG packet_header_chksum;
ULONG packet_chksum;
}SERIAL_PACKET_HEADER,*PSERIAL_PACKET_HEADER;
typedef struct _SERIAL_PACKET
{
SERIAL_PACKET_HEADER header;
UCHAR data[1];
}SERIAL_PACKET,*PSERIAL_PACKET;
#define ACK (0)
typedef enum _ECOLORS
{
BLACK = 0,
BLUE,
GREEN,
TURK,
RED,
VIOLET,
BROWN,
LTGRAY,
GRAY,
LTBLUE,
LT_GREEN,
LTTURK,
LTRED,
LTVIOLET,
YELLOW,
WHITE
}ECOLORS;
typedef struct _SERIAL_DATA_PACKET
{
UCHAR type;
UCHAR data[1];
}SERIAL_DATA_PACKET,*PSERIAL_DATA_PACKET;
#define PACKET_TYPE_CLRLINE (0)
typedef struct _SERIAL_DATA_PACKET_CLRLINE
{
UCHAR type;
ECOLORS fgcol,bkcol;
UCHAR line;
}SERIAL_DATA_PACKET_CLRLINE,*PSERIAL_DATA_PACKET_CLRLINE;
#define PACKET_TYPE_PRINT (1)
typedef struct _SERIAL_DATA_PACKET_PRINT
{
UCHAR type;
UCHAR x;
UCHAR y;
ECOLORS fgcol,bkcol;
UCHAR string[1];
}SERIAL_DATA_PACKET_PRINT,*PSERIAL_DATA_PACKET_PRINT;
#define PACKET_TYPE_CONNECT (2)
typedef struct _SERIAL_DATA_PACKET_CONNECT
{
UCHAR type;
UCHAR xsize,ysize;
}SERIAL_DATA_PACKET_CONNECT,*PSERIAL_DATA_PACKET_CONNECT;
#define PACKET_TYPE_CURSOR (3)
typedef struct _SERIAL_DATA_PACKET_CURSOR
{
UCHAR type;
UCHAR state,x,y;
}SERIAL_DATA_PACKET_CURSOR,*PSERIAL_DATA_PACKET_CURSOR;
#define PACKET_TYPE_INVERTLINE (4)
typedef struct _SERIAL_DATA_PACKET_INVERTLINE
{
UCHAR type;
UCHAR line;
}SERIAL_DATA_PACKET_INVERTLINE,*PSERIAL_DATA_PACKET_INVERTLINE;
#define PACKET_TYPE_POLL (5)
typedef struct _SERIAL_DATA_PACKET_POLL
{
UCHAR type;
USHORT major_version,minor_version,build_number;
}SERIAL_DATA_PACKET_POLL,*PSERIAL_DATA_PACKET_POLL;
// END of serial stuff
///////////////////////////////////////////////////////////////////////////////////
// EOF
-855
View File
@@ -1,855 +0,0 @@
/*
* pnpdump - PnP BIOS information dumper
*/
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ntddk.h>
#include <pshpack1.h>
typedef struct _CM_PNP_BIOS_DEVICE_NODE
{
USHORT Size;
UCHAR Node;
ULONG ProductId;
UCHAR DeviceType[3];
USHORT DeviceAttributes;
} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
{
UCHAR Signature[4]; // $PnP (ascii)
UCHAR Revision;
UCHAR Length;
USHORT ControlField;
UCHAR Checksum;
ULONG EventFlagAddress; // Physical address
USHORT RealModeEntryOffset;
USHORT RealModeEntrySegment;
USHORT ProtectedModeEntryOffset;
ULONG ProtectedModeCodeBaseAddress;
ULONG OemDeviceId;
USHORT RealModeDataBaseAddress;
ULONG ProtectedModeDataBaseAddress;
} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
#include <poppack.h>
typedef struct _PNP_ID_NAME_
{
char *PnpId;
char *DeviceName;
} PNP_ID_NAME, *PPNP_ID_NAME;
static char Hex[] = "0123456789ABCDEF";
static PNP_ID_NAME PnpName[] =
{
/* Interrupt Controllers */
{"PNP0000", "AT Interrupt Controller"},
{"PNP0001", "EISA Interrupt Controller"},
{"PNP0002", "MCA Interrupt Controller"},
{"PNP0003", "APIC"},
{"PNP0004", "Cyrix SLiC MP Interrupt Controller"},
/* Timers */
{"PNP0100", "AT Timer"},
{"PNP0101", "EISA Timer"},
{"PNP0102", "MCA Timer"},
/* DMA Controllers */
{"PNP0200", "AT DMA Controller"},
{"PNP0201", "EISA DMA Controller"},
{"PNP0202", "MCA DMA Controller"},
/* Keyboards */
{"PNP0300", "IBM PC/XT Keyboard (83 keys)"},
{"PNP0301", "IBM PC/AT Keyboard (86 keys)"},
{"PNP0302", "IBM PC/XT Keyboard (84 keys)"},
{"PNP0303", "IBM Enhanced (101/102 keys)"},
{"PNP0304", "Olivetti Keyboard (83 keys)"},
{"PNP0305", "Olivetti Keyboard (102 keys)"},
{"PNP0306", "Olivetti Keyboard (86 keys)"},
{"PNP0307", "Microsoft Windows(R) Keyboard"},
{"PNP0308", "General Input Device Emulation Interface (GIDEI) legacy"},
{"PNP0309", "Olivetti Keyboard (A101/102 key)"},
{"PNP030A", "AT&T 302 keyboard"},
{"PNP030B", "Reserved by Microsoft"},
{"PNP0320", "Japanese 101-key keyboard"},
{"PNP0321", "Japanese AX keyboard"},
{"PNP0322", "Japanese 106-key keyboard A01"},
{"PNP0323", "Japanese 106-key keyboard 002/003"},
{"PNP0324", "Japanese 106-key keyboard 001"},
{"PNP0325", "Japanese Toshiba Desktop keyboard"},
{"PNP0326", "Japanese Toshiba Laptop keyboard"},
{"PNP0327", "Japanese Toshiba Notebook keyboard"},
{"PNP0340", "Korean 84-key keyboard"},
{"PNP0341", "Korean 86-key keyboard"},
{"PNP0342", "Korean Enhanced keyboard"},
{"PNP0343", "Korean Enhanced keyboard 101b"},
{"PNP0343", "Korean Enhanced keyboard 101c"},
{"PNP0344", "Korean Enhanced keyboard 103"},
/* Parallel Ports */
{"PNP0400", "Standard LPT printer port"},
{"PNP0401", "ECP printer port"},
/* Serial Ports */
{"PNP0500", "Standard PC COM port"},
{"PNP0501", "16550A-compatible COM port"},
{"PNP0510", "Generic IRDA-compatible port"},
/* Harddisk Controllers */
{"PNP0600", "Generic ESDI/ATA/IDE harddisk controller"},
{"PNP0601", "Plus Hardcard II"},
{"PNP0602", "Plus Hardcard IIXL/EZ"},
{"PNP0603", "Generic IDE supporting Microsoft Device Bay Specification"},
/* Floppy Controllers */
{"PNP0700", "PC standard floppy disk controller"},
{"PNP0701", "Standard floppy controller supporting MS Device Bay Specification"},
/* obsolete devices */
{"PNP0800", "Microsoft Sound System compatible device"},
/* Display Adapters */
{"PNP0900", "VGA Compatible"},
{"PNP0901", "Video Seven VRAM/VRAM II/1024i"},
{"PNP0902", "8514/A Compatible"},
{"PNP0903", "Trident VGA"},
{"PNP0904", "Cirrus Logic Laptop VGA"},
{"PNP0905", "Cirrus Logic VGA"},
{"PNP0906", "Tseng ET4000"},
{"PNP0907", "Western Digital VGA"},
{"PNP0908", "Western Digital Laptop VGA"},
{"PNP0909", "S3 Inc. 911/924"},
{"PNP090A", "ATI Ultra Pro/Plus (Mach 32)"},
{"PNP090B", "ATI Ultra (Mach 8)"},
{"PNP090C", "XGA Compatible"},
{"PNP090D", "ATI VGA Wonder"},
{"PNP090E", "Weitek P9000 Graphics Adapter"},
{"PNP090F", "Oak Technology VGA"},
{"PNP0910", "Compaq QVision"},
{"PNP0911", "XGA/2"},
{"PNP0912", "Tseng Labs W32/W32i/W32p"},
{"PNP0913", "S3 Inc. 801/928/964"},
{"PNP0914", "Cirrus Logic 5429/5434 (memory mapped)"},
{"PNP0915", "Compaq Advanced VGA (AVGA)"},
{"PNP0916", "ATI Ultra Pro Turbo (Mach64)"},
{"PNP0917", "Reserved by Microsoft"},
{"PNP0918", "Matrox MGA"},
{"PNP0919", "Compaq QVision 2000"},
{"PNP091A", "Tseng W128"},
{"PNP0930", "Chips & Technologies Super VGA"},
{"PNP0931", "Chips & Technologies Accelerator"},
{"PNP0940", "NCR 77c22e Super VGA"},
{"PNP0941", "NCR 77c32blt"},
{"PNP09FF", "Plug and Play Monitors (VESA DDC)"},
/* Peripheral Buses */
{"PNP0A00", "ISA Bus"},
{"PNP0A01", "EISA Bus"},
{"PNP0A02", "MCA Bus"},
{"PNP0A03", "PCI Bus"},
{"PNP0A04", "VESA/VL Bus"},
{"PNP0A05", "Generic ACPI Bus"},
{"PNP0A06", "Generic ACPI Extended-IO Bus (EIO bus)"},
/* System devices */
{"PNP0800", "AT-style speaker sound"},
{"PNP0B00", "AT Real-Time Clock"},
{"PNP0C00", "Plug and Play BIOS (only created by the root enumerator)"},
{"PNP0C01", "System Board"},
{"PNP0C02", "General Plug and Play motherboard registers."},
{"PNP0C03", "Plug and Play BIOS Event Notification Interrupt"},
{"PNP0C04", "Math Coprocessor"},
{"PNP0C05", "APM BIOS (Version independent)"},
{"PNP0C06", "Reserved for identification of early Plug and Play BIOS implementation"},
{"PNP0C07", "Reserved for identification of early Plug and Play BIOS implementation"},
{"PNP0C08", "ACPI system board hardware"},
{"PNP0C09", "ACPI Embedded Controller"},
{"PNP0C0A", "ACPI Control Method Battery"},
{"PNP0C0B", "ACPI Fan"},
{"PNP0C0C", "ACPI power button device"},
{"PNP0C0D", "ACPI lid device"},
{"PNP0C0E", "ACPI sleep button device"},
{"PNP0C0F", "PCI interrupt link device"},
{"PNP0C10", "ACPI system indicator device"},
{"PNP0C11", "ACPI thermal zone"},
{"PNP0C12", "Device Bay Controller"},
/* PCMCIA Controllers */
{"PNP0E00", "Intel 82365-Compatible PCMCIA Controller"},
{"PNP0E01", "Cirrus Logic CL-PD6720 PCMCIA Controller"},
{"PNP0E02", "VLSI VL82C146 PCMCIA Controller"},
{"PNP0E03", "Intel 82365-compatible CardBus controller"},
/* Mice */
{"PNP0F00", "Microsoft Bus Mouse"},
{"PNP0F01", "Microsoft Serial Mouse"},
{"PNP0F02", "Microsoft InPort Mouse"},
{"PNP0F03", "Microsoft PS/2-style Mouse"},
{"PNP0F04", "Mouse Systems Mouse"},
{"PNP0F05", "Mouse Systems 3-Button Mouse (COM2)"},
{"PNP0F06", "Genius Mouse (COM1)"},
{"PNP0F07", "Genius Mouse (COM2)"},
{"PNP0F08", "Logitech Serial Mouse"},
{"PNP0F09", "Microsoft BallPoint Serial Mouse"},
{"PNP0F0A", "Microsoft Plug and Play Mouse"},
{"PNP0F0B", "Microsoft Plug and Play BallPoint Mouse"},
{"PNP0F0C", "Microsoft-compatible Serial Mouse"},
{"PNP0F0D", "Microsoft-compatible InPort-compatible Mouse"},
{"PNP0F0E", "Microsoft-compatible PS/2-style Mouse"},
{"PNP0F0F", "Microsoft-compatible Serial BallPoint-compatible Mouse"},
{"PNP0F10", "Texas Instruments QuickPort Mouse"},
{"PNP0F11", "Microsoft-compatible Bus Mouse"},
{"PNP0F12", "Logitech PS/2-style Mouse"},
{"PNP0F13", "PS/2 Port for PS/2-style Mice"},
{"PNP0F14", "Microsoft Kids Mouse"},
{"PNP0F15", "Logitech bus mouse"},
{"PNP0F16", "Logitech SWIFT device"},
{"PNP0F17", "Logitech-compatible serial mouse"},
{"PNP0F18", "Logitech-compatible bus mouse"},
{"PNP0F19", "Logitech-compatible PS/2-style Mouse"},
{"PNP0F1A", "Logitech-compatible SWIFT Device"},
{"PNP0F1B", "HP Omnibook Mouse"},
{"PNP0F1C", "Compaq LTE Trackball PS/2-style Mouse"},
{"PNP0F1D", "Compaq LTE Trackball Serial Mouse"},
{"PNP0F1E", "Microsoft Kids Trackball Mouse"},
{"PNP0F1F", "Reserved by Microsoft Input Device Group"},
{"PNP0F20", "Reserved by Microsoft Input Device Group"},
{"PNP0F21", "Reserved by Microsoft Input Device Group"},
{"PNP0F22", "Reserved by Microsoft Input Device Group"},
{"PNP0F23", "Reserved by Microsoft Input Device Group"},
{"PNP0FFF", "Reserved by Microsoft Systems"},
/* List Terminator */
{NULL, NULL}
};
/* FUNCTIONS ****************************************************************/
static char *
GetDeviceName(char *PnpId)
{
PPNP_ID_NAME IdName;
IdName = PnpName;
while (IdName->PnpId != NULL)
{
if (!strcmp(IdName->PnpId, PnpId))
return IdName->DeviceName;
IdName++;
}
return "Unknown Device";
}
LONG
GetPnpKey(PHKEY PnpKey)
{
LONG lError;
char szBuffer[80];
HKEY hAdapterKey;
HKEY hBusKey;
DWORD dwBus;
DWORD dwType;
DWORD dwSize;
*PnpKey = 0;
lError = RegOpenKey(HKEY_LOCAL_MACHINE,
"HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter",
&hAdapterKey);
if (lError != ERROR_SUCCESS)
return 0;
/* Enumerate buses */
for (dwBus = 0; ; dwBus++)
{
sprintf(szBuffer, "%lu", dwBus);
lError = RegOpenKey(hAdapterKey,
szBuffer,
&hBusKey);
if (lError != ERROR_SUCCESS)
{
RegCloseKey(hAdapterKey);
return lError;
}
dwSize = 80;
lError = RegQueryValueEx(hBusKey,
"Identifier",
NULL,
&dwType,
(LPBYTE)szBuffer,
&dwSize);
if (lError != ERROR_SUCCESS)
{
RegCloseKey(hBusKey);
RegCloseKey(hAdapterKey);
return lError;
}
if (dwType == REG_SZ && stricmp(szBuffer, "pnp bios") == 0)
{
*PnpKey = hBusKey;
RegCloseKey(hAdapterKey);
return ERROR_SUCCESS;
}
RegCloseKey(hBusKey);
}
return 1;
}
static VOID
PnpDecodeIrq(unsigned char *Ptr)
{
USHORT IrqMask;
int i;
IrqMask = *Ptr;
Ptr++;
IrqMask |= (*Ptr << 8);
printf(" IRQs:");
for (i = 0; i < 16; i++)
{
if (IrqMask & (1 << i))
{
printf(" %u", i);
}
}
printf("\n");
}
static VOID
PnpDecodeDma(unsigned char *Ptr)
{
unsigned char DmaChannel;
unsigned char DmaStatus;
int i;
DmaChannel = *Ptr;
Ptr++;
DmaStatus = *Ptr;
printf(" DMAs:");
for (i = 0; i < 8; i++)
{
if (DmaChannel & (1 << i))
{
printf(" %u", i);
}
}
printf("\n");
}
static VOID
PnpDecodeIoPort(unsigned char *Ptr)
{
USHORT MinBase;
USHORT MaxBase;
UCHAR Align;
UCHAR Length;
// Info = *Ptr;
Ptr++;
MinBase = *Ptr;
Ptr++;
MinBase += (*Ptr << 8);
Ptr++;
MaxBase = *Ptr;
Ptr++;
MaxBase += (*Ptr << 8);
Ptr++;
Align = *Ptr;
Ptr++;
Length = *Ptr;
printf(" I/O Port descriptor\n");
printf(" MinBase 0x%x MaxBase 0x%x Align %u Length %u\n",
MinBase, MaxBase, Align, Length);
}
static VOID
PnpDecodeFixedIoPort(unsigned char *Ptr)
{
USHORT IoPort;
UCHAR Length;
IoPort = *Ptr;
Ptr++;
IoPort += (*Ptr << 8);
Ptr++;
Length = *Ptr;
printf(" Fixed I/O Port descriptor\n");
printf(" PortBase 0x%hx Length 0x%x\n",
IoPort, Length);
#if 0
if (Length == 1)
{
printf(" Fixed location I/O Port descriptor: 0x%x\n",
IoPort);
}
else
{
printf(" Fixed location I/O Port descriptor: 0x%x - 0x%x\n",
IoPort,
IoPort + Length - 1);
}
#endif
}
static VOID
PnpDecodeMemory16(unsigned char *Ptr)
{
UCHAR Info;
USHORT MinBase;
USHORT MaxBase;
USHORT Align;
USHORT Length;
Info = *Ptr;
Ptr++;
MinBase = *Ptr;
Ptr++;
MinBase += (*Ptr << 8);
Ptr++;
MaxBase = *Ptr;
Ptr++;
MaxBase += (*Ptr << 8);
Ptr++;
Align = *Ptr;
Ptr++;
Align += (*Ptr << 8);
Ptr++;
Length = *Ptr;
Ptr++;
Length += (*Ptr << 8);
printf(" 16-Bit memory range descriptor\n");
printf(" MinBase 0x%hx MaxBase 0x%hx Align 0x%hx Length 0x%hx Flags 0x%02x\n",
MinBase, MaxBase, Align,Length, Info);
}
static VOID
PnpDecodeMemory32(unsigned char *Ptr)
{
UCHAR Info;
ULONG MinBase;
ULONG MaxBase;
ULONG Align;
ULONG Length;
Info = *Ptr;
Ptr++;
MinBase = *Ptr;
Ptr++;
MinBase += (*Ptr << 8);
Ptr++;
MinBase += (*Ptr << 16);
Ptr++;
MinBase += (*Ptr << 24);
Ptr++;
MaxBase = *Ptr;
Ptr++;
MaxBase += (*Ptr << 8);
Ptr++;
MaxBase += (*Ptr << 16);
Ptr++;
MaxBase += (*Ptr << 24);
Ptr++;
Align = *Ptr;
Ptr++;
Align += (*Ptr << 8);
Ptr++;
Align += (*Ptr << 16);
Ptr++;
Align += (*Ptr << 24);
Ptr++;
Length = *Ptr;
Ptr++;
Length += (*Ptr << 8);
Ptr++;
Length += (*Ptr << 16);
Ptr++;
Length += (*Ptr << 24);
printf(" 32-Bit memory range descriptor\n");
printf(" MinBase 0x%lx MaxBase 0x%lx Align 0x%lx Length 0x%lx Flags 0x%02x\n",
MinBase, MaxBase, Align,Length, Info);
}
static VOID
PnpDecodeFixedMemory(unsigned char *Ptr)
{
UCHAR Info;
ULONG Base;
ULONG Length;
Info = *Ptr;
Ptr++;
Base = *Ptr;
Ptr++;
Base += (*Ptr << 8);
Ptr++;
Base += (*Ptr << 16);
Ptr++;
Base += (*Ptr << 24);
Ptr++;
Length = *Ptr;
Ptr++;
Length += (*Ptr << 8);
Ptr++;
Length += (*Ptr << 16);
Ptr++;
Length += (*Ptr << 24);
printf(" 32-Bit fixed location memory range descriptor\n");
printf(" Base 0x%lx Length 0x%lx Flags 0x%02x\n",
Base, Length, Info);
}
void PrintDeviceData (PCM_PNP_BIOS_DEVICE_NODE DeviceNode)
{
char PnpId[8];
unsigned char *Ptr;
unsigned int TagSize;
unsigned int TagType;
unsigned char Id[4];
printf ("Node: %x Size %hu (0x%hx)\n",
DeviceNode->Node,
DeviceNode->Size,
DeviceNode->Size);
memcpy(Id, &DeviceNode->ProductId, 4);
PnpId[0] = ((Id[0] >> 2) & 0x1F) + 0x40;
PnpId[1] = ((Id[0] << 3) & 0x18) +
((Id[1] >> 5) & 0x07) + 0x40;
PnpId[2] = (Id[1] & 0x1F) + 0x40;
PnpId[3] = Hex[(Id[2] >> 4) & 0xF];
PnpId[4] = Hex[Id[2] & 0x0F];
PnpId[5] = Hex[(Id[3] >> 4) & 0x0F];
PnpId[6] = Hex[Id[3] & 0x0F];
PnpId[7] = 0;
printf(" '%s' (%s)\n",
PnpId, GetDeviceName(PnpId));
if (DeviceNode->Size > sizeof(CM_PNP_BIOS_DEVICE_NODE))
{
Ptr = (unsigned char *)(DeviceNode + 1);
while (TRUE)
{
if (*Ptr & 0x80)
{
TagType = *Ptr & 0x7F;
Ptr++;
TagSize = *Ptr;
Ptr++;
TagSize += (*Ptr << 16);
Ptr++;
switch (TagType)
{
case 1:
PnpDecodeMemory16(Ptr);
break;
case 5:
PnpDecodeMemory32(Ptr);
break;
case 6:
PnpDecodeFixedMemory(Ptr);
break;
default:
printf(" Large tag: type %u size %u\n",
TagType,
TagSize);
break;
}
}
else
{
TagType = (*Ptr >> 3) & 0x0F;
TagSize = *Ptr & 0x07;
Ptr++;
switch (TagType)
{
case 2:
printf(" Logical device ID\n");
break;
case 3:
printf(" Compatible device ID\n");
break;
case 4:
PnpDecodeIrq(Ptr);
break;
case 5:
PnpDecodeDma(Ptr);
break;
case 8:
PnpDecodeIoPort(Ptr);
break;
case 9:
PnpDecodeFixedIoPort(Ptr);
break;
case 0x0F: /* end tag */
break;
default:
printf(" Small tag: type %u size %u\n",
TagType,
TagSize);
break;
}
/* end tag */
if (TagType == 0x0F)
break;
}
Ptr = Ptr + TagSize;
}
}
}
int main (int argc, char *argv[])
{
LONG lError;
HKEY hPnpKey;
DWORD dwType;
DWORD dwSize;
BOOL Ask;
PCM_FULL_RESOURCE_DESCRIPTOR lpBuffer;
PCM_PNP_BIOS_INSTALLATION_CHECK lpPnpInst;
PCM_PNP_BIOS_DEVICE_NODE lpDevNode;
DWORD dwDataSize;
DWORD dwResourceSize;
hPnpKey = 0;
Ask = TRUE;
if (argc >1 && (!strcmp(argv[1],"/S") || !strcmp(argv[1],"/s")))
{
Ask = FALSE;
}
if (argc >1 && !strcmp(argv[1],"/?"))
{
printf("This utility prints the PnP-nodes from the registry\n");
printf("\"/s\" prevents the \"Press any key\"\n\n");
return 0;
}
lError = GetPnpKey(&hPnpKey);
if (lError != ERROR_SUCCESS)
{
printf("Failed to get PnP-BIOS key\n");
return 0;
}
if (hPnpKey != 0)
{
printf("Found PnP-BIOS key\n");
}
/* Allocate buffer */
dwSize = 2048;
lpBuffer = malloc(dwSize);
if (lpBuffer == NULL)
{
printf("Error: malloc() failed\n");
RegCloseKey(hPnpKey);
return 0;
}
do
{
lError = RegQueryValueEx(hPnpKey,
"Configuration Data",
NULL,
&dwType,
(LPBYTE)lpBuffer,
&dwSize);
if (lError == ERROR_MORE_DATA)
{
lpBuffer = realloc(lpBuffer, dwSize);
if (lpBuffer == NULL)
{
printf("Error: realloc() of %u bytes failed\n", (unsigned) dwSize);
RegCloseKey(hPnpKey);
return 0;
}
}
}
while (lError == ERROR_MORE_DATA);
if (lError != ERROR_SUCCESS)
{
printf("Failed to read 'Configuration Data' value\n");
free(lpBuffer);
RegCloseKey(hPnpKey);
return 0;
}
// printf ("Data size: %lu\n", dwSize);
RegCloseKey(hPnpKey);
// printf("Resource count %lu\n", lpBuffer->PartialResourceList.Count);
if (lpBuffer->PartialResourceList.Count == 0)
{
printf("Invalid resource count!\n");
free(lpBuffer);
return 0;
}
// printf("lpBuffer %p\n", lpBuffer);
dwResourceSize = lpBuffer->PartialResourceList.PartialDescriptors[0].u.DeviceSpecificData.DataSize;
// printf("ResourceSize: %lu\n", dwResourceSize);
lpPnpInst = (PCM_PNP_BIOS_INSTALLATION_CHECK)
((ULONG_PTR)(&lpBuffer->PartialResourceList.PartialDescriptors[0]) +
sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR));
// printf("lpPnpInst %p\n", lpPnpInst);
printf("Signature '%.4s'\n", lpPnpInst->Signature);
if (strncmp((PCHAR)lpPnpInst->Signature, "$PnP", 4))
{
printf("Error: Invalid PnP signature\n");
free(lpBuffer);
return 0;
}
// printf("InstCheck length: %lu\n", lpPnpInst->Length);
dwDataSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpPnpInst + sizeof(CM_PNP_BIOS_INSTALLATION_CHECK));
if (lpDevNode->Size == 0)
{
printf("Error: Device node size is zero!\n");
return 0;
}
#if 0
printf("Node: %x Size %hu (0x%hx)\n",
lpDevNode->Node,
lpDevNode->Size,
lpDevNode->Size);
printf("Done.\n");
return 0;
#endif
while (dwDataSize < dwResourceSize)
{
if (lpDevNode->Size == 0)
break;
printf("Node: %x Size %hu (0x%hx)\n",
lpDevNode->Node,
lpDevNode->Size,
lpDevNode->Size);
dwDataSize += lpDevNode->Size;
lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpDevNode + lpDevNode->Size);
}
if (Ask)
{
printf("\n Press any key...\n");
getch();
}
else
{
printf("\n");
}
dwDataSize = sizeof(CM_PNP_BIOS_INSTALLATION_CHECK);
lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpPnpInst + sizeof(CM_PNP_BIOS_INSTALLATION_CHECK));
while (dwDataSize < dwResourceSize)
{
if (lpDevNode->Size == 0)
break;
PrintDeviceData(lpDevNode);
if (Ask)
{
printf("\n Press any key...\n");
getch();
}
else
{
printf("\n");
}
dwDataSize += lpDevNode->Size;
lpDevNode = (PCM_PNP_BIOS_DEVICE_NODE)((DWORD)lpDevNode + lpDevNode->Size);
}
free(lpBuffer);
return 0;
}
/* EOF */
-281
View File
@@ -1,281 +0,0 @@
/*
*
* ReactOS ps - process list console viewer
*
* ps.c
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
Thanks to Filip Navara patch for fixing the Xp crash problem.
*/
#define NTOS_MODE_USER
#define WIN32_NO_STATUS
#include <windows.h>
#include <ndk/ntndk.h>
typedef struct _SYSTEM_THREADS
{
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
LONG BasePriority;
ULONG ContextSwitches;
ULONG ThreadState;
ULONG WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
typedef struct _SYSTEM_PROCESSES
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
LARGE_INTEGER SpareLi1;
LARGE_INTEGER SpareLi2;
LARGE_INTEGER SpareLi3;
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
KPRIORITY BasePriority;
HANDLE UniqueProcessId;
HANDLE InheritedFromUniqueProcessId;
ULONG HandleCount;
ULONG SessionId;
ULONG PageDirectoryFrame;
/*
* This part corresponds to VM_COUNTERS_EX.
* NOTE: *NOT* THE SAME AS VM_COUNTERS!
*/
ULONG PeakVirtualSize;
ULONG VirtualSize;
ULONG PageFaultCount;
ULONG PeakWorkingSetSize;
ULONG WorkingSetSize;
ULONG QuotaPeakPagedPoolUsage;
ULONG QuotaPagedPoolUsage;
ULONG QuotaPeakNonPagedPoolUsage;
ULONG QuotaNonPagedPoolUsage;
ULONG PagefileUsage;
ULONG PeakPagefileUsage;
ULONG PrivateUsage;
/* This part corresponds to IO_COUNTERS */
LARGE_INTEGER ReadOperationCount;
LARGE_INTEGER WriteOperationCount;
LARGE_INTEGER OtherOperationCount;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
SYSTEM_THREADS Threads [1];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
// x00000000 00000000 000:00:00 000:00:00 ()
static char title[] = "P PID PPID KTime UTime NAME\n";
static char title1[] = "t TID KTime UTime State WaitResson\n";
static char title2[] = "w PID Hwnd WndStile TID WndName\n";
struct status {
DWORD state;
const char desc[10];
} thread_stat[8 + 1] = {
{0, "Init "},
{1, "Ready "},
{2, "Running "},
{3, "Standby "},
{4, "Terminated"},
{5, "Wait "},
{6, "Transition"},
{7, "Unknown "},
{-1," ? "}
};
struct waitres {
DWORD state;
char desc[17];
} waitreason[35 + 1] = {
{0, "Executive "},
{1, "FreePage "},
{2, "PageIn "},
{3, "PoolAllocation "},
{4, "DelayExecution "},
{5, "Suspended "},
{6, "UserRequest "},
{7, "WrExecutive "},
{8, "WrFreePage "},
{9, "WrPageIn "},
{10,"WrPoolAllocation "},
{11,"WrDelayExecution "},
{12,"WrSuspended "},
{13,"WrUserRequest "},
{14,"WrEventPair "},
{15,"WrQueue "},
{16,"WrLpcReceive "},
{17,"WrLpcReply "},
{18,"WrVirtualMemory "},
{19,"WrPageOut "},
{20,"WrRendezvous "},
{21,"Spare2 "},
{22,"WrGuardedMutex "},
{23,"Spare4 "},
{24,"Spare5 "},
{25,"Spare6 "},
{26,"WrKernel "},
{27,"WrResource "},
{28,"WrPushLock "},
{29,"WrMutex "},
{30,"WrQuantumEnd "},
{31,"WrDispatchInt "},
{32,"WrPreempted "},
{33,"WrYieldExecution "},
{34,"MaximumWaitReason"},
{-1," ? "}
};
static BOOL CALLBACK
EnumThreadProc(HWND hwnd, LPARAM lp)
{
DWORD r, pid, tid;
LONG style;
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
char buf[256];
GetWindowText(hwnd, (LPTSTR)lp, 30);
if(hwnd != 0)
{
style = GetWindowLong(hwnd, GWL_STYLE);
tid = GetWindowThreadProcessId(hwnd, &pid);
wsprintf (buf,"w%8d %8x %08x %8d %s\n",pid, hwnd , style, tid, lp );
WriteFile(stdout, buf, lstrlen(buf), &r, NULL);
}
return (TRUE);
}
int main()
{
DWORD r;
ANSI_STRING astring;
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
PSYSTEM_PROCESSES SystemProcesses = NULL;
PSYSTEM_PROCESSES CurrentProcess;
ULONG BufferSize, ReturnSize;
NTSTATUS Status;
char buf[256];
char buf1[256];
WriteFile(stdout, title, lstrlen(title), &r, NULL);
WriteFile(stdout, title1, lstrlen(title1), &r, NULL);
WriteFile(stdout, title2, lstrlen(title2), &r, NULL);
/* Get process information. */
BufferSize = 0;
do
{
BufferSize += 0x10000;
SystemProcesses = HeapAlloc(GetProcessHeap(), 0, BufferSize);
Status = NtQuerySystemInformation(SystemProcessInformation,
SystemProcesses, BufferSize,
&ReturnSize);
if (Status == STATUS_INFO_LENGTH_MISMATCH)
HeapFree(GetProcessHeap(), 0, SystemProcesses);
} while (Status == STATUS_INFO_LENGTH_MISMATCH);
/* If querying system information failed, bail out. */
if (!NT_SUCCESS(Status))
return 1;
/* For every process print the information. */
CurrentProcess = SystemProcesses;
while (CurrentProcess->NextEntryOffset != 0)
{
int hour, hour1, thour, thour1;
unsigned char minute, minute1, tmin, tmin1;
unsigned char seconds, seconds1, tsec, tsec1;
unsigned int ti;
LARGE_INTEGER ptime;
ptime.QuadPart = CurrentProcess->KernelTime.QuadPart;
hour = (ptime.QuadPart / (10000000LL * 3600LL));
minute = (ptime.QuadPart / (10000000LL * 60LL)) % 60LL;
seconds = (ptime.QuadPart / 10000000LL) % 60LL;
ptime.QuadPart = CurrentProcess->UserTime.QuadPart;
hour1 = (ptime.QuadPart / (10000000LL * 3600LL));
minute1 = (ptime.QuadPart / (10000000LL * 60LL)) % 60LL;
seconds1 = (ptime.QuadPart / 10000000LL) % 60LL;
RtlUnicodeStringToAnsiString(&astring, &CurrentProcess->ImageName, TRUE);
wsprintf(buf,"P%8d %8d %3d:%02d:%02d %3d:%02d:%02d ProcName: %s\n",
CurrentProcess->UniqueProcessId, CurrentProcess->InheritedFromUniqueProcessId,
hour, minute, seconds, hour1, minute1, seconds1,
astring.Buffer);
WriteFile(stdout, buf, lstrlen(buf), &r, NULL);
RtlFreeAnsiString(&astring);
for (ti = 0; ti < CurrentProcess->NumberOfThreads; ti++)
{
struct status *statt;
struct waitres *waitt;
char szWindowName[30] = {" "};
ptime = CurrentProcess->Threads[ti].KernelTime;
thour = (ptime.QuadPart / (10000000LL * 3600LL));
tmin = (ptime.QuadPart / (10000000LL * 60LL)) % 60LL;
tsec = (ptime.QuadPart / 10000000LL) % 60LL;
ptime = CurrentProcess->Threads[ti].UserTime;
thour1 = (ptime.QuadPart / (10000000LL * 3600LL));
tmin1 = (ptime.QuadPart / (10000000LL * 60LL)) % 60LL;
tsec1 = (ptime.QuadPart / 10000000LL) % 60LL;
statt = thread_stat;
while (statt->state != CurrentProcess->Threads[ti].ThreadState && statt->state >= 0)
statt++;
waitt = waitreason;
while (waitt->state != CurrentProcess->Threads[ti].WaitReason && waitt->state >= 0)
waitt++;
wsprintf (buf1,
"t% %8d %3d:%02d:%02d %3d:%02d:%02d %s %s\n",
CurrentProcess->Threads[ti].ClientId.UniqueThread,
thour, tmin, tsec, thour1, tmin1, tsec1,
statt->desc , waitt->desc);
WriteFile(stdout, buf1, lstrlen(buf1), &r, NULL);
EnumThreadWindows(PtrToUlong(CurrentProcess->Threads[ti].ClientId.UniqueThread),
(WNDENUMPROC) EnumThreadProc,
(LPARAM)(LPTSTR) szWindowName );
}
CurrentProcess = (PSYSTEM_PROCESSES)((ULONG_PTR)CurrentProcess +
(ULONG_PTR)CurrentProcess->NextEntryOffset);
}
return (0);
}
-70
View File
@@ -1,70 +0,0 @@
/* $Id$
*
* ReactOS ps - process list console viewer
*
* ps.c
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <windows.h>
#include <tlhelp32.h>
static char* title = " PID PARENT TIME NAME\n";
char buf[256];
int main()
{
DWORD r;
HANDLE pl;
PROCESSENTRY32 pe;
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(stdout, title, lstrlen(title), &r, NULL);
pl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize = sizeof(PROCESSENTRY32);
pe.th32ParentProcessID = 0;
if (Process32First(pl, &pe)) do {
int hour;
int minute;
WORD fatdate;
WORD fattime;
HANDLE p = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe.th32ProcessID);
FILETIME cr;
FILETIME ex;
FILETIME kt;
FILETIME ut;
GetProcessTimes(p, &cr, &ex, &kt, &ut);
FileTimeToDosDateTime(&cr, &fatdate, &fattime);
hour = (fattime & 0xf800) >> 11;
minute = (fattime & 0x07e0) >> 5;
wsprintf(buf,"%08X %08X %2d:%02d %s\n", pe.th32ProcessID, pe.th32ParentProcessID, hour, minute, pe.szExeFile);
WriteFile(stdout, buf, lstrlen(buf), &r, NULL);
CloseHandle(p);
pe.th32ParentProcessID = 0;
} while (Process32Next(pl, &pe));
CloseHandle(pl);
}
/*
BOOL
STDCALL
FileTimeToDosDateTime(
CONST FILETIME *lpFileTime,
LPWORD lpFatDate,
LPWORD lpFatTime
);
*/
-8
View File
@@ -1,8 +0,0 @@
<module name="ps" type="win32cui" installbase="bin" installname="ps.exe">
<include base="ps">.</include>
<define name="__USE_W32API" />
<library>user32</library>
<library>kernel32</library>
<library>ntdll</library>
<file>ps.c</file>
</module>
-88
View File
@@ -1,88 +0,0 @@
/*
* ReactOS RosPerf - ReactOS GUI performance test program
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <windows.h>
#include <wingdi.h>
#include "rosperf.h"
typedef struct _ALPHABLEND_CONTEXT {
HDC BitmapDc;
HBITMAP Bitmap;
} ALPHABLEND_CONTEXT, *PALPHABLEND_CONTEXT;
unsigned
AlphaBlendInit(void **Context, PPERF_INFO PerfInfo, unsigned Reps)
{
PALPHABLEND_CONTEXT ctx = HeapAlloc(GetProcessHeap(), 0, sizeof (ALPHABLEND_CONTEXT));
INT x, y;
ctx->BitmapDc = CreateCompatibleDC(PerfInfo->BackgroundDc);
ctx->Bitmap = CreateCompatibleBitmap(PerfInfo->BackgroundDc, PerfInfo->WndWidth, PerfInfo->WndHeight);
SelectObject(ctx->BitmapDc, ctx->Bitmap);
for (y = 0; y < PerfInfo->WndHeight; y++)
{
for (x = 0; x < PerfInfo->WndWidth; x++)
{
SetPixel(ctx->BitmapDc, x, y, RGB(0xff, 0x00, 0x00));
}
}
*Context = ctx;
return Reps;
}
void
AlphaBlendCleanup(void *Context, PPERF_INFO PerfInfo)
{
PALPHABLEND_CONTEXT ctx = Context;
DeleteDC(ctx->BitmapDc);
DeleteObject(ctx->Bitmap);
HeapFree(GetProcessHeap(), 0, ctx);
}
ULONG
DbgPrint(
IN PCSTR Format,
IN ...);
void
AlphaBlendProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps)
{
PALPHABLEND_CONTEXT ctx = Context;
unsigned Rep;
BLENDFUNCTION BlendFunc = { AC_SRC_OVER, 0, 0, 0 };
for (Rep = 0; Rep < Reps; Rep++)
{
BlendFunc.SourceConstantAlpha = 255 * Rep / Reps;
#if 0
PatBlt(PerfInfo->BackgroundDc, 0, 0, PerfInfo->WndWidth, PerfInfo->WndHeight, PATCOPY);
#endif
if (!AlphaBlend(PerfInfo->BackgroundDc, 0, 0, PerfInfo->WndWidth, PerfInfo->WndHeight,
ctx->BitmapDc, 0, 0, PerfInfo->WndWidth, PerfInfo->WndHeight,
BlendFunc))
{
DbgPrint("AlphaBlend failed (0x%lx)\n", GetLastError());
}
}
}
/* EOF */
-60
View File
@@ -1,60 +0,0 @@
/*
* ReactOS RosPerf - ReactOS GUI performance test program
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <windows.h>
#include "rosperf.h"
void
FillProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps)
{
unsigned Rep;
for (Rep = 0; Rep < Reps; Rep++)
{
PatBlt((Rep & 0x100) ? PerfInfo->BackgroundDc : PerfInfo->ForegroundDc, 0, 0,
PerfInfo->WndWidth, PerfInfo->WndHeight, PATCOPY);
}
}
void
FillSmallProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps)
{
#define SMALL_SIZE 16
unsigned Rep;
int x, y;
x = 0;
y = 0;
for (Rep = 0; Rep < Reps; Rep++)
{
PatBlt((Rep & 0x10000) ? PerfInfo->BackgroundDc : PerfInfo->ForegroundDc, x, y,
SMALL_SIZE, SMALL_SIZE, PATCOPY);
x += SMALL_SIZE + 1;
if (PerfInfo->WndWidth < x + SMALL_SIZE)
{
x = 0;
y += SMALL_SIZE + 1;
if (PerfInfo->WndHeight < y + SMALL_SIZE)
{
y = 0;
}
}
}
}
/* EOF */
-97
View File
@@ -1,97 +0,0 @@
/*
* ReactOS RosPerf - ReactOS GUI performance test program
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <windows.h>
#include "rosperf.h"
void
LinesProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps)
{
unsigned Rep;
int Dest;
HDC Dc;
for (Rep = 0; Rep < Reps; )
{
Dc = (Rep & 0x1000) ? PerfInfo->BackgroundDc : PerfInfo->ForegroundDc;
for (Dest = 2; Dest < PerfInfo->WndHeight && Rep < Reps; Rep++, Dest += 2)
{
MoveToEx(Dc, 0, 0, NULL);
LineTo(Dc, PerfInfo->WndWidth, Dest);
}
for (Dest = PerfInfo->WndWidth - 2; 0 <= Dest && Rep < Reps; Rep++, Dest -= 2)
{
MoveToEx(Dc, PerfInfo->WndWidth, 0, NULL);
LineTo(Dc, Dest, PerfInfo->WndHeight);
}
for (Dest = PerfInfo->WndHeight - 2; 0 <= Dest && Rep < Reps; Rep++, Dest -= 2)
{
MoveToEx(Dc, PerfInfo->WndWidth, PerfInfo->WndHeight, NULL);
LineTo(Dc, 0, Dest);
}
for (Dest = 2; Dest < PerfInfo->WndWidth && Rep < Reps; Rep++, Dest += 2)
{
MoveToEx(Dc, 0, PerfInfo->WndHeight, NULL);
LineTo(Dc, Dest, 0);
}
}
}
void
LinesHorizontalProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps)
{
unsigned Rep;
int y;
HDC Dc;
for (Rep = 0; Rep < Reps; )
{
Dc = (Rep & 0x10000) ? PerfInfo->BackgroundDc : PerfInfo->ForegroundDc;
for (y = 0; y < PerfInfo->WndHeight && Rep < Reps; Rep++, y += 3)
{
MoveToEx(Dc, 0, y, NULL);
LineTo(Dc, PerfInfo->WndWidth, y);
}
}
}
void
LinesVerticalProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps)
{
unsigned Rep;
int x;
HDC Dc;
for (Rep = 0; Rep < Reps; )
{
Dc = (Rep & 0x1000) ? PerfInfo->BackgroundDc : PerfInfo->ForegroundDc;
for (x = 0; x < PerfInfo->WndWidth && Rep < Reps; Rep++, x += 3)
{
MoveToEx(Dc, x, 0, NULL);
LineTo(Dc, x, PerfInfo->WndHeight);
}
}
}
/* EOF */
-923
View File
@@ -1,923 +0,0 @@
/*
* ReactOS RosPerf - ReactOS GUI performance test program
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* Ideas copied from x11perf:
*
* Copyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Digital not be
* used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission.
*
* DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <reactos/buildno.h>
#include "rosperf.h"
#define MAINWND_WIDTH 400
#define MAINWND_HEIGHT 400
static HWND LabelWnd;
unsigned
NullInit(void **Context, PPERF_INFO PerfInfo, unsigned Reps)
{
*Context = NULL;
return Reps;
}
void
NullCleanup(void *Context, PPERF_INFO PerfInfo)
{
}
static void
ProcessMessages(void)
{
MSG Msg;
while (PeekMessageW(&Msg, NULL, 0, 0, PM_REMOVE))
{
if (WM_QUIT == Msg.message)
{
exit(Msg.wParam);
}
TranslateMessage(&Msg);
DispatchMessageW(&Msg);
}
}
static void
ClearWindow(PPERF_INFO PerfInfo)
{
InvalidateRect(PerfInfo->Wnd, NULL, TRUE);
UpdateWindow(PerfInfo->Wnd);
}
static unsigned
CalibrateTest(PTEST Test, PPERF_INFO PerfInfo)
{
#define GOAL 2500 /* Try to get up to 2.5 seconds */
#define ENOUGH 2000 /* But settle for 2.0 seconds */
#define TICK 10 /* Assume clock not faster than .01 seconds */
unsigned Reps, DidReps; /* Reps desired, reps performed */
unsigned Exponent;
void *Context;
DWORD StartTick;
DWORD Duration;
/* Attempt to get an idea how long each rep lasts by getting enough
reps to last more than ENOUGH. Then scale that up to the number of
seconds desired.
If init call to test ever fails, return False and test will be skipped.
*/
Reps = 1;
for (;;)
{
ClearWindow(PerfInfo);
DidReps = (*Test->Init)(&Context, PerfInfo, Reps);
ProcessMessages();
if (0 == DidReps)
{
return 0;
}
StartTick = GetTickCount();
(*Test->Proc)(Context, PerfInfo, Reps);
Duration = GetTickCount() - StartTick;
(*Test->PassCleanup) (Context, PerfInfo);
(*Test->Cleanup)(Context, PerfInfo);
ProcessMessages();
if (DidReps != Reps)
{
/* The test can't do the number of reps as we asked for.
Give up */
return DidReps;
}
/* Did we go long enough? */
if (ENOUGH <= Duration)
{
break;
}
/* Don't let too short a clock make new reps wildly high */
if (Duration <= TICK)
{
Reps *= 10;
}
else
{
/* Try to get up to GOAL seconds. */
Reps = (int)(GOAL * (double) Reps / (double) Duration) + 1;
}
}
Reps = (int) ((double) PerfInfo->Seconds * 1000.0 * (double) Reps / (double) Duration) + 1;
/* Now round reps up to 1 digit accuracy, so we don't get stupid-looking
numbers of repetitions. */
Reps--;
Exponent = 1;
while (9 < Reps)
{
Reps /= 10;
Exponent *= 10;
}
Reps = (Reps + 1) * Exponent;
return Reps;
}
static void
DisplayStatus(HWND Label, LPCWSTR Message, LPCWSTR Test, int Try)
{
WCHAR Status[128];
snwprintf(Status, sizeof(Status) / sizeof(Status[0]), L"%d %s %s", Try, Message, Test);
SetWindowTextW(Label, Status);
InvalidateRect(Label, NULL, TRUE);
UpdateWindow(Label);
}
static double
RoundTo3Digits(double d)
{
/* It's kind of silly to print out things like ``193658.4/sec'' so just
junk all but 3 most significant digits. */
double exponent, sign;
exponent = 1.0;
/* the code below won't work if d should happen to be non-positive. */
if (d < 0.0)
{
d = -d;
sign = -1.0;
}
else
{
sign = 1.0;
}
if (1000.0 <= d)
{
do
{
exponent *= 10.0;
}
while (1000.0 <= d / exponent);
d = (double)((int)(d / exponent + 0.5));
d *= exponent;
}
else
{
if (0.0 != d)
{
while (d * exponent < 100.0)
{
exponent *= 10.0;
}
}
d = (double)((int)(d * exponent + 0.5));
d /= exponent;
}
return d * sign;
}
static void
ReportTimes(DWORD Time, int Reps, LPCWSTR Label, BOOL Average)
{
double MSecsPerObj, ObjsPerSec;
if (0 != Time)
{
MSecsPerObj = (double) Time / (double) Reps;
ObjsPerSec = (double) Reps * 1000.0 / (double) Time;
/* Round obj/sec to 3 significant digits. Leave msec untouched, to
allow averaging results from several repetitions. */
ObjsPerSec = RoundTo3Digits(ObjsPerSec);
wprintf(L"%7d %s @ %8.4f msec (%8.1f/sec): %s\n",
Reps, Average ? L"trep" : L"reps", MSecsPerObj, ObjsPerSec, Label);
}
else
{
wprintf(L"%6d %sreps @ 0.0 msec (unmeasurably fast): %s\n",
Reps, Average ? L"t" : L"", Label);
}
}
static void
ProcessTest(PTEST Test, PPERF_INFO PerfInfo)
{
unsigned Reps;
unsigned Repeat;
void *Context;
DWORD StartTick;
DWORD Time, TotalTime;
DisplayStatus(LabelWnd, L"Calibrating", Test->Label, 0);
Reps = CalibrateTest(Test, PerfInfo);
if (0 == Reps)
{
return;
}
Reps = Test->Init(&Context, PerfInfo, Reps);
if (0 == Reps)
{
return;
}
TotalTime = 0;
for (Repeat = 0; Repeat < PerfInfo->Repeats; Repeat++)
{
DisplayStatus(LabelWnd, L"Testing", Test->Label, Repeat + 1);
ClearWindow(PerfInfo);
StartTick = GetTickCount();
(*Test->Proc)(Context, PerfInfo, Reps);
Time = GetTickCount() - StartTick;
ProcessMessages();
TotalTime += Time;
ReportTimes(Time, Reps, Test->Label, FALSE);
(*Test->PassCleanup)(Context, PerfInfo);
ProcessMessages();
}
(*Test->Cleanup)(Context, PerfInfo);
ReportTimes(TotalTime, Repeat * Reps, Test->Label, TRUE);
ProcessMessages();
}
static void
PrintOSVersion(void)
{
#define BUFSIZE 160
OSVERSIONINFOEXW VersionInfo;
BOOL OsVersionInfoEx;
HKEY hKey;
WCHAR ProductType[BUFSIZE];
DWORD BufLen;
LONG Ret;
unsigned RosVersionLen;
LPWSTR RosVersion;
/* Try calling GetVersionEx using the OSVERSIONINFOEX structure.
* If that fails, try using the OSVERSIONINFO structure. */
ZeroMemory(&VersionInfo, sizeof(OSVERSIONINFOEXW));
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
OsVersionInfoEx = GetVersionExW((OSVERSIONINFOW *) &VersionInfo);
if (! OsVersionInfoEx)
{
VersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionExW((OSVERSIONINFOW *) &VersionInfo))
{
return;
}
}
RosVersion = VersionInfo.szCSDVersion + wcslen(VersionInfo.szCSDVersion) + 1;
RosVersionLen = sizeof(VersionInfo.szCSDVersion) / sizeof(VersionInfo.szCSDVersion[0]) -
(RosVersion - VersionInfo.szCSDVersion);
if (7 <= RosVersionLen && 0 == _wcsnicmp(RosVersion, L"ReactOS", 7))
{
wprintf(L"Running on %s\n", RosVersion);
return;
}
switch (VersionInfo.dwPlatformId)
{
/* Test for the Windows NT product family. */
case VER_PLATFORM_WIN32_NT:
/* Test for the specific product. */
if (5 == VersionInfo.dwMajorVersion && 2 == VersionInfo.dwMinorVersion)
{
wprintf(L"Running on Microsoft Windows Server 2003, ");
}
else if (5 == VersionInfo.dwMajorVersion && 1 == VersionInfo.dwMinorVersion)
{
wprintf(L"Running on Microsoft Windows XP ");
}
else if (5 == VersionInfo.dwMajorVersion && 0 == VersionInfo.dwMinorVersion)
{
wprintf(L"Running on Microsoft Windows 2000 ");
}
else if (VersionInfo.dwMajorVersion <= 4 )
{
wprintf(L"Running on Microsoft Windows NT ");
}
/* Test for specific product on Windows NT 4.0 SP6 and later. */
if (OsVersionInfoEx)
{
/* Test for the workstation type. */
if (VER_NT_WORKSTATION == VersionInfo.wProductType)
{
if (4 == VersionInfo.dwMajorVersion)
{
wprintf(L"Workstation 4.0 ");
}
else if (0 != (VersionInfo.wSuiteMask & VER_SUITE_PERSONAL))
{
wprintf(L"Home Edition ");
}
else
{
wprintf(L"Professional ");
}
}
/* Test for the server type. */
else if (VER_NT_SERVER == VersionInfo.wProductType ||
VER_NT_DOMAIN_CONTROLLER == VersionInfo.wProductType)
{
if (5 == VersionInfo.dwMajorVersion && 2 == VersionInfo.dwMinorVersion)
{
if (0 != (VersionInfo.wSuiteMask & VER_SUITE_DATACENTER))
{
wprintf(L"Datacenter Edition ");
}
else if (0 != (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE))
{
wprintf(L"Enterprise Edition ");
}
else if (VER_SUITE_BLADE == VersionInfo.wSuiteMask)
{
wprintf(L"Web Edition ");
}
else
{
wprintf(L"Standard Edition ");
}
}
else if (5 == VersionInfo.dwMajorVersion && 0 == VersionInfo.dwMinorVersion)
{
if (0 != (VersionInfo.wSuiteMask & VER_SUITE_DATACENTER))
{
wprintf(L"Datacenter Server ");
}
else if (0 != (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE))
{
wprintf(L"Advanced Server " );
}
else
{
wprintf(L"Server " );
}
}
else /* Windows NT 4.0 */
{
if (0 != (VersionInfo.wSuiteMask & VER_SUITE_ENTERPRISE))
{
wprintf(L"Server 4.0, Enterprise Edition ");
}
else
{
wprintf(L"Server 4.0 ");
}
}
}
}
else /* Test for specific product on Windows NT 4.0 SP5 and earlier */
{
BufLen = BUFSIZE;
Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
0, KEY_QUERY_VALUE, &hKey);
if (ERROR_SUCCESS != Ret)
{
return;
}
Ret = RegQueryValueExW(hKey, L"ProductType", NULL, NULL,
(LPBYTE) ProductType, &BufLen);
if (ERROR_SUCCESS != Ret || BUFSIZE < BufLen)
{
return;
}
RegCloseKey(hKey);
if (0 == lstrcmpiW(L"WINNT", ProductType))
{
wprintf(L"Workstation ");
}
else if (0 == lstrcmpiW(L"LANMANNT", ProductType))
{
wprintf(L"Server ");
}
else if (0 == lstrcmpiW(L"SERVERNT", ProductType))
{
wprintf(L"Advanced Server ");
}
wprintf(L"%d.%d ", VersionInfo.dwMajorVersion, VersionInfo.dwMinorVersion);
}
/* Display service pack (if any) and build number. */
if (4 == VersionInfo.dwMajorVersion &&
0 == lstrcmpiW(VersionInfo.szCSDVersion, L"Service Pack 6"))
{
/* Test for SP6 versus SP6a. */
Ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Hotfix\\Q246009",
0, KEY_QUERY_VALUE, &hKey);
if (ERROR_SUCCESS == Ret)
{
wprintf(L"Service Pack 6a (Build %d)\n", VersionInfo.dwBuildNumber & 0xFFFF);
}
else /* Windows NT 4.0 prior to SP6a */
{
wprintf(L"%s (Build %d)\n",
VersionInfo.szCSDVersion,
VersionInfo.dwBuildNumber & 0xFFFF);
}
RegCloseKey(hKey);
}
else /* not Windows NT 4.0 */
{
wprintf(L"%s (Build %d)\n",
VersionInfo.szCSDVersion,
VersionInfo.dwBuildNumber & 0xFFFF);
}
break;
/* Test for the Windows Me/98/95. A bit silly since we're using Unicode... */
case VER_PLATFORM_WIN32_WINDOWS:
if (4 == VersionInfo.dwMajorVersion && 0 == VersionInfo.dwMinorVersion)
{
wprintf(L"Running on Microsoft Windows 95 ");
if (L'C' == VersionInfo.szCSDVersion[1] || L'B' == VersionInfo.szCSDVersion[1])
{
wprintf(L"OSR2");
}
}
else if (4 == VersionInfo.dwMajorVersion && 10 == VersionInfo.dwMinorVersion)
{
wprintf(L"Running on Microsoft Windows 98 ");
if (L'A' == VersionInfo.szCSDVersion[1])
{
wprintf(L"SE");
}
}
else if (4 == VersionInfo.dwMajorVersion && 90 == VersionInfo.dwMinorVersion)
{
wprintf(L"Running on Microsoft Windows Millennium Edition");
}
wprintf(L"\n");
break;
case VER_PLATFORM_WIN32s: /* Even silier... */
wprintf(L"Running on Microsoft Win32s\n");
break;
}
}
static void
PrintAppVersion(void)
{
wprintf(L"RosPerf %S (Build %S)\n", KERNEL_VERSION_STR, KERNEL_VERSION_BUILD_STR);
}
static void
PrintDisplayInfo(void)
{
HDC Dc;
Dc = GetDC(NULL);
if (NULL == Dc)
{
return;
}
wprintf(L"Display settings %d * %d * %d\n", GetDeviceCaps(Dc, HORZRES),
GetDeviceCaps(Dc, VERTRES), GetDeviceCaps(Dc, BITSPIXEL) * GetDeviceCaps(Dc, PLANES));
ReleaseDC(NULL, Dc);
}
static void
PrintStartupInfo(void)
{
PrintAppVersion();
PrintOSVersion();
PrintDisplayInfo();
}
static LRESULT CALLBACK
MainWndProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT Ps;
HDC Dc;
LRESULT Result;
switch (Msg)
{
case WM_DESTROY:
PostQuitMessage(0);
Result = 0;
break;
case WM_PAINT:
Dc = BeginPaint(Wnd, &Ps);
EndPaint (Wnd, &Ps);
Result = 0;
break;
default:
Result = DefWindowProcW(Wnd, Msg, wParam, lParam);
break;
}
return Result;
}
static LRESULT CALLBACK
LabelWndProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT Ps;
HDC Dc;
RECT ClientRect, WindowRect;
TEXTMETRICW Tm;
LRESULT Result;
WCHAR Title[80];
switch (Msg)
{
case WM_CREATE:
/* Make text fit */
Dc = GetDC(Wnd);
if (NULL != Dc && GetClientRect(Wnd, &ClientRect) && GetWindowRect(Wnd, &WindowRect)
&& GetTextMetricsW(Dc, &Tm))
{
if (Tm.tmHeight != ClientRect.bottom)
{
SetWindowPos(Wnd, NULL, 0, 0, WindowRect.right - WindowRect.left,
(WindowRect.bottom - WindowRect.top) + (Tm.tmHeight - ClientRect.bottom),
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER);
}
}
if (NULL != Dc)
{
ReleaseDC(Wnd, Dc);
}
Result = DefWindowProcW(Wnd, Msg, wParam, lParam);
break;
case WM_PAINT:
Dc = BeginPaint(Wnd, &Ps);
GetWindowTextW(Wnd, Title, sizeof(Title) / sizeof(Title[0]));
TextOutW(Dc, 0, 0, Title, wcslen(Title));
EndPaint (Wnd, &Ps);
Result = 0;
break;
default:
Result = DefWindowProcW(Wnd, Msg, wParam, lParam);
break;
}
return Result;
}
static HWND
CreatePerfWindows(HINSTANCE hInstance, PPERF_INFO PerfInfo)
{
WNDCLASSW wc;
HWND MainWnd;
wc.lpszClassName = L"RosPerfMain";
wc.lpfnWndProc = MainWndProc;
wc.style = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(NULL, (LPCWSTR) IDI_APPLICATION);
wc.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
wc.hbrBackground = CreateSolidBrush(PerfInfo->BackgroundColor);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if (RegisterClassW(&wc) == 0)
{
fwprintf(stderr, L"Failed to register RosPerfMain (last error %d)\n",
GetLastError());
return NULL;
}
wc.lpszClassName = L"RosPerfLabel";
wc.lpfnWndProc = LabelWndProc;
wc.style = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(NULL, (LPCWSTR) IDI_APPLICATION);
wc.hCursor = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if (RegisterClassW(&wc) == 0)
{
fwprintf(stderr, L"Failed to register RosPerfLabel (last error %d)\n",
GetLastError());
return NULL;
}
MainWnd = CreateWindowW(L"RosPerfMain",
L"ReactOS performance test",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
0,
0,
MAINWND_WIDTH,
MAINWND_HEIGHT,
NULL,
NULL,
hInstance,
NULL);
if (NULL == MainWnd)
{
fwprintf(stderr, L"Failed to create main window (last error %d)\n",
GetLastError());
return NULL;
}
LabelWnd = CreateWindowW(L"RosPerfLabel",
L"",
WS_POPUP | WS_THICKFRAME | WS_VISIBLE,
0,
MAINWND_HEIGHT + 10,
MAINWND_WIDTH,
20,
MainWnd,
NULL,
hInstance,
NULL);
if (NULL == LabelWnd)
{
fwprintf(stderr, L"Failed to create label window (last error 0x%lX)\n",
GetLastError());
return NULL;
}
SetActiveWindow(MainWnd);
return MainWnd;
}
static BOOL
ProcessCommandLine(PPERF_INFO PerfInfo, unsigned *TestCount, PTEST *Tests)
{
int ArgC, Arg;
LPWSTR *ArgV;
LPWSTR EndPtr;
PTEST AllTests;
BOOL *DoTest;
BOOL DoAll;
unsigned AllTestCount, i, j;
ArgV = CommandLineToArgvW(GetCommandLineW(), &ArgC);
if (NULL == ArgV)
{
fwprintf(stderr, L"CommandLineToArgvW failed\n");
return FALSE;
}
GetTests(&AllTestCount, &AllTests);
DoTest = malloc(AllTestCount * sizeof(BOOL));
if (NULL == DoTest)
{
fwprintf(stderr, L"Out of memory\n");
return FALSE;
}
DoAll = TRUE;
for (Arg = 1; Arg < ArgC; Arg++)
{
if (L'/' == ArgV[Arg][0] || L'-' == ArgV[Arg][0])
{
if (0 == _wcsicmp(ArgV[Arg] + 1, L"repeat"))
{
if (ArgC <= Arg + 1)
{
fwprintf(stderr, L"%s needs a repeat count\n", ArgV[Arg]);
free(DoTest);
GlobalFree(ArgV);
return FALSE;
}
Arg++;
PerfInfo->Repeats = wcstoul(ArgV[Arg], &EndPtr, 0);
if (L'\0' != *EndPtr || (long) PerfInfo->Repeats <= 0 || ULONG_MAX == PerfInfo->Repeats)
{
fwprintf(stderr, L"Invalid repeat count %s\n", ArgV[Arg]);
free(DoTest);
GlobalFree(ArgV);
return FALSE;
}
}
else if (0 == _wcsicmp(ArgV[Arg] + 1, L"seconds"))
{
if (ArgC <= Arg + 1)
{
fwprintf(stderr, L"%s needs a number of seconds\n", ArgV[Arg]);
free(DoTest);
GlobalFree(ArgV);
return FALSE;
}
Arg++;
PerfInfo->Seconds = wcstoul(ArgV[Arg], &EndPtr, 0);
if (L'\0' != *EndPtr || (long) PerfInfo->Seconds < 0 || ULONG_MAX == PerfInfo->Seconds)
{
fwprintf(stderr, L"Invalid duration %s\n", ArgV[Arg]);
free(DoTest);
GlobalFree(ArgV);
return FALSE;
}
}
else
{
fwprintf(stderr, L"Unrecognized option %s\n", ArgV[Arg]);
free(DoTest);
GlobalFree(ArgV);
return FALSE;
}
}
else
{
if (DoAll)
{
for (i = 0; i < AllTestCount; i++)
{
DoTest[i] = FALSE;
}
DoAll = FALSE;
}
for (i = 0; i < AllTestCount; i++)
{
if (0 == _wcsicmp(ArgV[Arg], AllTests[i].Option))
{
DoTest[i] = TRUE;
break;
}
}
if (AllTestCount <= i)
{
fwprintf(stderr, L"Unrecognized test %s\n", ArgV[Arg]);
free(DoTest);
GlobalFree(ArgV);
return FALSE;
}
}
}
GlobalFree(ArgV);
if (DoAll)
{
for (i = 0; i < AllTestCount; i++)
{
DoTest[i] = TRUE;
}
}
*TestCount = 0;
for (i = 0; i < AllTestCount; i++)
{
if (DoTest[i])
{
(*TestCount)++;
}
}
*Tests = malloc(*TestCount * sizeof(TEST));
if (NULL == *Tests)
{
fwprintf(stderr, L"Out of memory\n");
free(DoTest);
return FALSE;
}
j = 0;
for (i = 0; i < AllTestCount; i++)
{
if (DoTest[i])
{
(*Tests)[j] = AllTests[i];
j++;
}
}
free(DoTest);
return TRUE;
}
int WINAPI
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
PTEST Tests;
unsigned TestCount;
unsigned CurrentTest;
RECT Rect;
PERF_INFO PerfInfo;
PrintStartupInfo();
PerfInfo.Seconds = 15;
PerfInfo.Repeats = 4;
PerfInfo.ForegroundColor = RGB(0, 0, 0);
PerfInfo.BackgroundColor = RGB(255, 255, 255);
if (! ProcessCommandLine(&PerfInfo, &TestCount, &Tests))
{
exit(1);
}
PerfInfo.Wnd = CreatePerfWindows(hInstance, &PerfInfo);
if (NULL == PerfInfo.Wnd)
{
exit(1);
}
GetClientRect(PerfInfo.Wnd, &Rect);
PerfInfo.WndWidth = Rect.right - Rect.left;
PerfInfo.WndHeight = Rect.bottom - Rect.top;
PerfInfo.ForegroundDc = GetDC(PerfInfo.Wnd);
PerfInfo.BackgroundDc = GetDC(PerfInfo.Wnd);
if (NULL == PerfInfo.ForegroundDc || NULL == PerfInfo.BackgroundDc)
{
fwprintf(stderr, L"Failed to create device contexts (last error %d)\n",
GetLastError());
exit(1);
}
SelectObject(PerfInfo.ForegroundDc, CreateSolidBrush(PerfInfo.ForegroundColor));
SelectObject(PerfInfo.ForegroundDc, CreatePen(PS_SOLID, 0, PerfInfo.ForegroundColor));
SelectObject(PerfInfo.BackgroundDc, CreateSolidBrush(PerfInfo.BackgroundColor));
SelectObject(PerfInfo.BackgroundDc, CreatePen(PS_SOLID, 0, PerfInfo.BackgroundColor));
ProcessMessages();
/* Move cursor out of the way */
GetWindowRect(LabelWnd, &Rect);
SetCursorPos(Rect.right, Rect.bottom);
for (CurrentTest = 0; CurrentTest < TestCount; CurrentTest++)
{
wprintf(L"\n");
ProcessTest(Tests + CurrentTest, &PerfInfo);
}
GlobalFree(Tests);
return 0;
}
/* EOF */
-70
View File
@@ -1,70 +0,0 @@
/*
* ReactOS RosPerf - ReactOS GUI performance test program
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef ROSPERF_H_INCLUDED
#define ROSPERF_H_INCLUDED
typedef struct tagPERF_INFO
{
HWND Wnd;
unsigned Seconds;
unsigned Repeats;
COLORREF ForegroundColor;
COLORREF BackgroundColor;
HDC ForegroundDc;
HDC BackgroundDc;
INT WndWidth;
INT WndHeight;
} PERF_INFO, *PPERF_INFO;
typedef unsigned (*INITTESTPROC)(void **Context, PPERF_INFO PerfInfo, unsigned Reps);
typedef void (*TESTPROC)(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
typedef void (*CLEANUPTESTPROC)(void *Context, PPERF_INFO PerfInfo);
typedef struct tagTEST
{
LPCWSTR Option;
LPCWSTR Label;
INITTESTPROC Init;
TESTPROC Proc;
CLEANUPTESTPROC PassCleanup;
CLEANUPTESTPROC Cleanup;
} TEST, *PTEST;
void GetTests(unsigned *TestCount, PTEST *Tests);
/* Tests */
unsigned NullInit(void **Context, PPERF_INFO PerfInfo, unsigned Reps);
void NullCleanup(void *Context, PPERF_INFO PerfInfo);
void FillProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
void FillSmallProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
void LinesHorizontalProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
void LinesVerticalProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
void LinesProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
void TextProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
unsigned AlphaBlendInit(void **Context, PPERF_INFO PerfInfo, unsigned Reps);
void AlphaBlendCleanup(void *Context, PPERF_INFO PerfInfo);
void AlphaBlendProc(void *Context, PPERF_INFO PerfInfo, unsigned Reps);
#endif /* ROSPERF_H_INCLUDED */
/* EOF */
-4
View File
@@ -1,4 +0,0 @@
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS performance tester\0"
#define REACTOS_STR_INTERNAL_NAME "rosperf\0"
#define REACTOS_STR_ORIGINAL_FILENAME "rosperf.exe\0"
#include <reactos/version.rc>

Some files were not shown because too many files have changed in this diff Show More