Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевести код СИ в Delphi 
:(
    Опции темы
Delphist
  Дата 24.3.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Помогите перевести на Delphi эти Листинги:

Листинг 1:

Код
/***********************************************************

Компиляция: Используйте седство DDK BUILD.

#include <ntddk.h>


#pragma pack(push,1)

/* Структуры для манипулирования регистром GDT и дескриптором сегмента в GDT. 

* Документированы в книгах по процессорам Intel. */

typedef struct {

unsigned short limit;

GDTENT *base;

} GDTREG;

typedef struct {

unsigned limit : 16;

unsigned baselo : 16;

unsigned basemid : 8;

unsigned type : 4;

unsigned system : 1;

unsigned dpl : 2;

unsigned present : 1;

unsigned limithi : 4;

unsigned available : 1;

unsigned zero : 1;

unsigned size : 1;

unsigned granularity : 1;

unsigned basehi : 8;

} GDTENT;

#pragma pack(pop)


void SetTSSLimit(int size)

{

GDTREG gdtreg;

GDTENT *g;

short TaskSeg;

_asm cli; // Нас не должны прерывать!

_asm sgdt gdtreg; // получаем адрес GDT

_asm str TaskSeg; // получаем селектор TSS

g = gdtreg.base + (TaskSeg >> 3); // получаем указатель на дескриптор TSS

g->limit = size; // изменяем предел сегмента TSS


g->type = 9; // помечаем TSS как “не занятый”


_asm ltr TaskSeg; // перезагрузка регистра задачи(TR)

_asm sti; // Разрешаем прерывания

}


void GiveTotalIO(void)

{

SetTSSLimit(0x20ab + 0xf00);

}


void RemoveTotalIO(void)

{

SetTSSLimit(0x20ab);

}

/****** Освобождаем память и всё такое *******/

VOID

TotalIOdrvUnload(

IN PDRIVER_OBJECT DriverObject

)

{

RemoveTotalIO();

}

/****** Процедура входа. Всё стартуется *****/

NTSTATUS DriverEntry(

IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath

)

{

DriverObject->DriverUnload = TotalIOdrvUnload;

GiveTotalIO();

return STATUS_SUCCESS;

}

 

Листинг 2:


void GiveIO()

{

char *CurProc;

CurProc = IoGetCurrentProcess();

*((USHORT *)(CurProc + 0x30)) = 0x88;

}

 Листинг 3:


Компиляция: Используйте средство DDK BUILD


#include <ntddk.h>

#include <mondebug.h>

/* Имя нашего драйвера устройства */

#define DEVICE_NAME_STRING L"giveio"

/* Это “структура” IOPM. Это просто массив байт размером 0x2000.

* Он содержит 8К * 8 бит -> 64К бит IOPM, которые покрывают всё 

* 64 килобайтное адресное пространство в/в x86 процессора.

* Каждый нулевой бит предоставляет доступ к соответствующему порту

* для user-mode процесса. Каждый единичный бит запрещает доступ к в/в 

* через соответствующий порт.

*/

#define IOPM_SIZE 0x2000

typedef UCHAR IOPM[IOPM_SIZE];

/* Это будет содержать просто массив нулей, который будет копироваться

* в настоящую IOPM в TSS через Ke386SetIoAccessMap(). Память выделяется

* во время загрузки драйвера.

*/

IOPM *IOPM_local = 0;

/* Это две недокументированных функции которые мы используем чтобы дать

* доступ к в/в вызывающему процессу.

* Ke386IoSetAccessMap() копирует переданную карту в/в в TSS.

* Ke386IoSetAccessProcess() изменяет указатель смещения IOPM после чего

* только что скопированная карта в/в начинает использоватья.

* Иначе смещение IOPM указывает за предел сегмента TSS, что приведёт 

* генерации исключения при попытке доступа к в/в любым user-mode процессом.

*/

void Ke386SetIoAccessMap(int, IOPM *);

void Ke386QueryIoAccessMap(int, IOPM *);

void Ke386IoSetAccessProcess(PEPROCESS, int);

/***** Освободить все выделенные ранее объекты ******/

VOID GiveioUnload(IN PDRIVER_OBJECT DriverObject)

{

WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;

UNICODE_STRING uniDOSString;

if(IOPM_local)

MmFreeNonCachedMemory(IOPM_local, sizeof(IOPM));

RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);

IoDeleteSymbolicLink (&uniDOSString);

IoDeleteDevice(DriverObject->DeviceObject);

}

/**********************************************************
Устанавливаем IOPM (карту разрешения в/в) вызывающего процесса так, что ему предоставляется полный доступ к в/в. Наш массив IOPM_local[] содержит только нули, соответственно IOPM обнулится. Если OnFlag == 1, процессу предоставляется доступ к в/в. Если он равен 0, доступ запрещается.

*****************************************/

VOID SetIOPermissionMap(int OnFlag)

{

Ke386IoSetAccessProcess(PsGetCurrentProcess(), OnFlag);

Ke386SetIoAccessMap(1, IOPM_local);

}

void GiveIO(void)

{

SetIOPermissionMap(1);

}

/***********************************************************

Служебный обработчик для user-mode вызова CreateProcess(). Эта функция введена в таблицу вызовов функций объекта драйвера с помощью DriverEntry(). Когда user-mode приложение вызывает CreateFile(), эта функция получает управление всё ещё в контексте вызвавшего приложения, но с CPL (текущий уровень привилегий процессора) установленым в 0. Это позволяет производить операции возможные только в kernel mode. GiveIO() вызывается для предоставления вызывающему процессу доступа к в/в. Все что приложение режима пользователя которому нужен доступ к в/в должно сделать – это открыть данное устройство используя CreateFile(). Никаких других действий не нужно.

********************************/

NTSTATUS GiveioCreateDispatch(

IN PDEVICE_OBJECT DeviceObject,

IN PIRP Irp

)

{

GiveIO(); // give the calling process I/O access

Irp->IoStatus.Information = 0;

Irp->IoStatus.Status = STATUS_SUCCESS;

IoCompleteRequest(Irp, IO_NO_INCREMENT);

return STATUS_SUCCESS;

}

/**********************************************************

Процедура входа драйвера. Эта процедура вызывается только раз после загрузки драйвера в память. Она выделяет необходимые ресурсы для работы драйвера. В нашем случае она выделяет память для массива IOPM, и создаёт устройство которое может открыть приложение режима пользователя. Она также создаёт символическую ссылку на драйвер устройства. Это позволяет user-mode приложению получить доступ к нашему драйверу используя \\.\giveio нотацию.

*****************************************/

NTSTATUS DriverEntry(

IN PDRIVER_OBJECT DriverObject,

IN PUNICODE_STRING RegistryPath

)

{

PDEVICE_OBJECT deviceObject;

NTSTATUS status;

WCHAR NameBuffer[] = L"\\Device\\" DEVICE_NAME_STRING;

WCHAR DOSNameBuffer[] = L"\\DosDevices\\" DEVICE_NAME_STRING;

UNICODE_STRING uniNameString, uniDOSString;

// Выделим буфер для локальной IOPM и обнулим его.

IOPM_local = MmAllocateNonCachedMemory(sizeof(IOPM));

if(IOPM_local == 0)

return STATUS_INSUFFICIENT_RESOURCES;

RtlZeroMemory(IOPM_local, sizeof(IOPM));

// Инициализируем драйвер устройства и объект устройства (device object)

RtlInitUnicodeString(&uniNameString, NameBuffer);

RtlInitUnicodeString(&uniDOSString, DOSNameBuffer);

status = IoCreateDevice(DriverObject, 0, &uniNameString,

FILE_DEVICE_UNKNOWN, 0, FALSE, &deviceObject);

if(!NT_SUCCESS(status))

return status;

status = IoCreateSymbolicLink (&uniDOSString, &uniNameString);

if (!NT_SUCCESS(status))

return status;

// Инициализируем точки входа драйвера в объекте драйвера.

// Всё что нам нужно это операции создания (Create) и выгрузки (Unload)

DriverObject->MajorFunction[IRP_MJ_CREATE] = GiveioCreateDispatch;

DriverObject->DriverUnload = GiveioUnload;

return STATUS_SUCCESS;

}


Это сообщение отредактировал(а) p0s0l - 30.9.2005, 09:19


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
<Spawn>
Дата 24.3.2004, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Насколько я понял, то это драйвер, а Дельфи для этого не предназначена, то есть перевод данного кода бессмысленен


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Maverick
Дата 24.3.2004, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: нет
Всего: 10



Лучше бы в Сишный форум это.... Больше сишников владеют Дельфями, чем делфистов Си.... К сожалению или счастью...


--------------------
smile
PM ICQ GTalk   Вверх
LAGO
Дата 23.5.2004, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 12.3.2004
Где: Москва.

Репутация: нет
Всего: нет



Тут лучше написать алгарифм данного кода, как работает, далее сделать на том языке который нужен ;) imho
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.