AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unit von C++ nach Delphi

Ein Thema von Zacherl · begonnen am 30. Okt 2007 · letzter Beitrag vom 30. Okt 2007
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Unit von C++ nach Delphi

  Alt 30. Okt 2007, 14:56
Hey,

ich habe folgende interesante Unit gefunden: http://www.koders.com/c/fid9C75A3C3C...4792D2918.aspx

Könnte mir jemand helfen die nach Delphi zu portieren?

Habe schon angefangen, komme nun aber absoult nicht weiter. Auch die PEB Deklaration ist noch nicht korrekt. Habe ich aus den JEDI Headern kopiert, aber in meiner Unit macht er keine Unterscheidung zwischen den OS Versionen:

Delphi-Quellcode:
type
  _SECURITY_ATTRIBUTES = record
    nLength: DWord;
    lpSecurityDescriptor: Pointer;
    bInheritHandle: Boolean;
  end;
  SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;
  PSECURITY_ATTRIBUTES = ^_SECURITY_ATTRIBUTES;
  LPSECURITY_ATTRIBUTES = ^_SECURITY_ATTRIBUTES;

type
  LPTHREAD_START_ROUTINE = Pointer;

type
  _UNICODE_STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: PWideChar;
  end;
  UNICODE_STRING = _UNICODE_STRING;
  PUNICODE_STRING = ^_UNICODE_STRING;

type
  _OBJECT_ATTRIBUTES = record
    Length: ULONG;
    RootDirectory: Cardinal;
    ObjectName: PUNICODE_STRING;
    Attributes: ULONG;
    SecurityDescriptor: Pointer;
    SecurityQualityOfService: Pointer;
  end;
  OBJECT_ATTRIBUTES = _OBJECT_ATTRIBUTES;
  POBJECT_ATTRIBUTES = ^_OBJECT_ATTRIBUTES;

type
  _CLIENT_ID = record
    UniqueProcess: Cardinal;
    UniqueThread: Cardinal;
  end;
  CLIENT_ID = _CLIENT_ID;

type
  _INITIAL_TEB = record
    StackCommit: ULong;
    StackReserve: ULong;
    StackBase: Pointer;
    StackLimit: Pointer;
    StackAllocate: Pointer;
  end;
  INITIAL_TEB = _INITIAL_TEB;

type
  PLIST_ENTRY = ^_LIST_ENTRY;

type
  _LDR_MODULE = record
    InLoadOrderModuleList: LIST_ENTRY;
    InOrderModuleList: LIST_ENTRY;
    InInitializationOrderModuleList: LIST_ENTRY;
    BaseAddress: Pointer;
    EntryPoint: ULong;
    SizeOfImage: ULong;
    FullDllName: UNICODE_STRING;
    BaseDllName: UNICODE_STRING;
    Flags: ULong;
    LoadCount: Word;
    TlsIndex: Word;
    SectionHandle: Cardinal;
    CheckSum: ULong;
    TimeDateStamp: ULong;
  end;
  PLDR_MODULE = ^_LDR_MODULE;

type
  _DLLMAIN_FUNC = function(hInst: Cardinal; ul_reason_for_call: ULong;
    lpReserved: Pointer): BOOl; stdcall;
  PDLLMAIN_FUNC = ^_DLLMAIN_FUNC;

type
  PRTL_CRITICAL_SECTION = ^RTL_CRITICAL_SECTION;

type
  _STRING = record
    Length: Word;
    MaximumLength: Word;
    Buffer: PCHAR;
  end;

type
// =================================================================
// PROCESS ENVIRONMENT BLOCK (PEB)
// =================================================================

// Verified in XP using WinDbg
  _LDR_DATA_TABLE_ENTRY = record // not packed!
    case Integer of
  (*   *)0: (
  (*000*)InLoadOrderLinks: LIST_ENTRY
        );
  (*   *)1: (
  (*000*)InMemoryOrderLinks: LIST_ENTRY
        );
  (*   *)2: (
  (*000*)InInitializationOrderLinks: LIST_ENTRY;
  (*008*)DllBase: Pointer;
  (*00c*)EntryPoint: Pointer;
  (*010*)SizeOfImage: ULONG;
  (*014*)FullDllName: UNICODE_STRING;
  (*01c*)BaseDllName: UNICODE_STRING;
  (*024*)Flags: ULONG;
  (*028*)LoadCount: Word;
  (*02a*)TlsIndex: Word;
  (*02c*)HashLinks: LIST_ENTRY;
  (*034*)SectionPointer: Pointer;
  (*038*)CheckSum: ULONG;
  (*03C*)TimeDateStamp: ULONG;
  (*040*)LoadedImports: Pointer;
  (*044*)EntryPointActivationContext: Pointer; // PACTIVATION_CONTEXT
  (*048*)PatchInformation: Pointer;
        )
  end;
  LDR_DATA_TABLE_ENTRY = _LDR_DATA_TABLE_ENTRY;
  PLDR_DATA_TABLE_ENTRY = ^_LDR_DATA_TABLE_ENTRY;
  PPLDR_DATA_TABLE_ENTRY = ^PLDR_DATA_TABLE_ENTRY;
  TLdrDataTableEntry = _LDR_DATA_TABLE_ENTRY;
  PLdrDataTableEntry = ^_LDR_DATA_TABLE_ENTRY;

// Verified in XP using WinDbg
  _PEB_LDR_DATA = record // not packed!
  (*000*)Length: ULONG;
  (*004*)Initialized: BOOLEAN;
  (*008*)SsHandle: Pointer;
  (*00c*)InLoadOrderModuleList: LIST_ENTRY;
  (*014*)InMemoryOrderModuleList: LIST_ENTRY;
  (*01c*)InInitializationOrderModuleList: LIST_ENTRY;
  (*024*)EntryInProgress: Pointer;
  end;
  PEB_LDR_DATA = _PEB_LDR_DATA;
  PPEB_LDR_DATA = ^_PEB_LDR_DATA;
  PPPEB_LDR_DATA = ^PPEB_LDR_DATA;
  TPebLdrData = _PEB_LDR_DATA;
  PPebLdrData = ^_PEB_LDR_DATA;

// Verified in XP using WinDbg
  _RTL_DRIVE_LETTER_CURDIR = record // not packed!
  (*000*)Flags: Word;
  (*002*)Length: Word;
  (*004*)TimeStamp: ULONG;
  (*008*)DosPath: _STRING;
  end;
  RTL_DRIVE_LETTER_CURDIR = _RTL_DRIVE_LETTER_CURDIR;
  PRTL_DRIVE_LETTER_CURDIR = ^_RTL_DRIVE_LETTER_CURDIR;
  PPRTL_DRIVE_LETTER_CURDIR = ^PRTL_DRIVE_LETTER_CURDIR;
  TRtlDriveLetterCurdir = _RTL_DRIVE_LETTER_CURDIR;
  PRtlDriveLetterCurdir = ^_RTL_DRIVE_LETTER_CURDIR;

  _CURDIR = record // not packed!
  (*000*)DosPath: UNICODE_STRING;
  (*008*)Handle: Cardinal;
  end;
  CURDIR = _CURDIR;
  PCURDIR = ^_CURDIR;
  PPCURDIR = ^PCURDIR;
  TCurdir = _CURDIR;
// PCurdir = ^_CURDIR; // <--- Pascal is case-insensitive

// Verified in XP using WinDbg
  _RTL_USER_PROCESS_PARAMETERS = record // not packed!
  (*000*)MaximumLength: ULONG;
  (*004*)Length: ULONG;
  (*008*)Flags: ULONG; // Bit 0: all pointers normalized
  (*00c*)DebugFlags: ULONG;
  (*010*)ConsoleHandle: Cardinal;
  (*014*)ConsoleFlags: ULONG;
  (*018*)StandardInput: Cardinal;
  (*01c*)StandardOutput: Cardinal;
  (*020*)StandardError: Cardinal;
  (*024*)CurrentDirectory: CURDIR;
  (*030*)DllPath: UNICODE_STRING;
  (*038*)ImagePathName: UNICODE_STRING;
  (*040*)CommandLine: UNICODE_STRING;
  (*048*)Environment: Pointer;
  (*04c*)StartingX: ULONG;
  (*050*)StartingY: ULONG;
  (*054*)CountX: ULONG;
  (*058*)CountY: ULONG;
  (*05c*)CountCharsX: ULONG;
  (*060*)CountCharsY: ULONG;
  (*064*)FillAttribute: ULONG;
  (*068*)WindowFlags: ULONG;
  (*06c*)ShowWindowFlags: ULONG;
  (*070*)WindowTitle: UNICODE_STRING;
  (*078*)DesktopInfo: UNICODE_STRING;
  (*080*)ShellInfo: UNICODE_STRING;
  (*088*)RuntimeData: UNICODE_STRING;
  (*090*)CurrentDirectories: array[0..31] of RTL_DRIVE_LETTER_CURDIR;
  end;
  RTL_USER_PROCESS_PARAMETERS = _RTL_USER_PROCESS_PARAMETERS;
  PRTL_USER_PROCESS_PARAMETERS = ^_RTL_USER_PROCESS_PARAMETERS;
  PPRTL_USER_PROCESS_PARAMETERS = ^PRTL_USER_PROCESS_PARAMETERS;
  TRtlUserProcessParameters = _RTL_USER_PROCESS_PARAMETERS;
  PRtlUserProcessParameters = ^_RTL_USER_PROCESS_PARAMETERS;
  TProcessParameters = _RTL_USER_PROCESS_PARAMETERS;
  PProcessParameters = ^_RTL_USER_PROCESS_PARAMETERS;

  _SYSTEM_STRINGS = record // not packed!
  (*000*)SystemRoot: UNICODE_STRING; // %SystemRoot%
  (*008*)System32Root: UNICODE_STRING; // %SystemRoot%\System32
  (*010*)BaseNamedObjects: UNICODE_STRING; // \BaseNamedObjects
  end;
  SYSTEM_STRINGS = _SYSTEM_STRINGS;
  PSYSTEM_STRINGS = ^_SYSTEM_STRINGS;
  PPSYSTEM_STRINGS = ^PSYSTEM_STRINGS;
  TSystemStrings = _SYSTEM_STRINGS;
  PSystemStrings = ^_SYSTEM_STRINGS;

// Verified in XP using WinDbg
  _TEXT_INFO = record // not packed!
  (*000*)Reserved: Pointer;
  (*004*)SystemStrings: PSYSTEM_STRINGS;
  end;
  TEXT_INFO = _TEXT_INFO;
  PTEXT_INFO = ^_TEXT_INFO;
  PPTEXT_INFO = ^PTEXT_INFO;
  TTextInfo = _TEXT_INFO;
  PTextInfo = ^_TEXT_INFO;

// Verified in XP using WinDbg
  PPEB_FREE_BLOCK = ^_PEB_FREE_BLOCK;
  _PEB_FREE_BLOCK = record // not packed!
  (*000*)Next: PPEB_FREE_BLOCK;
  (*004*)Size: ULONG;
  end;
  PEB_FREE_BLOCK = _PEB_FREE_BLOCK;
  PPPEB_FREE_BLOCK = ^PPEB_FREE_BLOCK;
  TPebFreeBlock = _PEB_FREE_BLOCK;
  PPebFreeBlock = ^_PEB_FREE_BLOCK;

// Verified in W2K, WXP and W2K3 using WinDbg
  _PEB_W2K = packed record // packed!
  (*000*)InheritedAddressSpace: BOOLEAN;
  (*001*)ReadImageFileExecOptions: BOOLEAN;
  (*002*)BeingDebugged: BOOLEAN;
  (*003*)SpareBool: BOOLEAN;
  (*004*)Mutant: Pointer;
  (*008*)ImageBaseAddress: Pointer;
  (*00c*)Ldr: PPEB_LDR_DATA;
  (*010*)ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;
  (*014*)SubSystemData: Pointer;
  (*018*)ProcessHeap: Pointer;
  (*01c*)FastPebLock: PRTL_CRITICAL_SECTION;
  (*020*)FastPebLockRoutine: Pointer; // RtlEnterCriticalSection
  (*024*)FastPebUnlockRoutine: Pointer; // RtlLeaveCriticalSection
  (*028*)EnvironmentUpdateCount: ULONG;
  (*02c*)KernelCallbackTable: Pointer; // List of callback functions
  (*030*)SystemReserved: array[0..0] of ULONG;
  (*034*)d034: ULONG;
  (*038*)FreeList: PPEB_FREE_BLOCK;
  (*03c*)TlsExpansionCounter: ULONG;
  (*040*)TlsBitmap: Pointer; // ntdll!TlsBitMap of type PRTL_BITMAP
  (*044*)TlsBitmapBits: array[0..1] of ULONG; // 64 bits
  (*04c*)ReadOnlySharedMemoryBase: Pointer;
  (*050*)ReadOnlySharedMemoryHeap: Pointer;
  (*054*)ReadOnlyStaticServerData: PTEXT_INFO;
  (*058*)AnsiCodePageData: Pointer;
  (*05c*)OemCodePageData: Pointer;
  (*060*)UnicodeCaseTableData: Pointer;
  (*064*)NumberOfProcessors: ULONG;
  (*068*)NtGlobalFlag: ULONG;
  (*06C*)Unknown01: ULONG; // Padding or something
  (*070*)CriticalSectionTimeout: LARGE_INTEGER;
  (*078*)HeapSegmentReserve: ULONG;
  (*07c*)HeapSegmentCommit: ULONG;
  (*080*)HeapDeCommitTotalFreeThreshold: ULONG;
  (*084*)HeapDeCommitFreeBlockThreshold: ULONG;
  (*088*)NumberOfHeaps: ULONG;
  (*08c*)MaximumNumberOfHeaps: ULONG;
  (*090*)ProcessHeaps: Pointer;
  (*094*)GdiSharedHandleTable: Pointer;
  (*098*)ProcessStarterHelper: Pointer;
  (*09c*)GdiDCAttributeList: ULONG;
  (*0a0*)LoaderLock: PRTL_CRITICAL_SECTION;
  (*0a4*)OSMajorVersion: ULONG;
  (*0a8*)OSMinorVersion: ULONG;
  (*0ac*)OSBuildNumber: Word;
  (*0ae*)OSCSDVersion: Word;
  (*0b0*)OSPlatformId: ULONG;
  (*0b4*)ImageSubsystem: ULONG;
  (*0b8*)ImageSubsystemMajorVersion: ULONG;
  (*0bc*)ImageSubsystemMinorVersion: ULONG;
  (*0c0*)ImageProcessAffinityMask: ULONG;
  (*0c4*)GdiHandleBuffer: array[0..33] of Cardinal;
  (*14c*)PostProcessInitRoutine: Pointer;
  (*150*)TlsExpansionBitmap: Pointer;
  (*154*)TlsExpansionBitmapBits: array[0..31] of ULONG;
  (*1d4*)SessionId: ULONG;
  // Windows 2000
  (*1d8*)AppCompatInfo: Pointer;
  (*1dc*)CSDVersion: UNICODE_STRING;
  end;

// Verified in W2K, WXP and W2K3 using WinDbg
  _PEB_WXP = packed record // packed!
  (*000*)InheritedAddressSpace: BOOLEAN;
  (*001*)ReadImageFileExecOptions: BOOLEAN;
  (*002*)BeingDebugged: BOOLEAN;
  (*003*)SpareBool: BOOLEAN;
  (*004*)Mutant: Pointer;
  (*008*)ImageBaseAddress: Pointer;
  (*00c*)Ldr: PPEB_LDR_DATA;
  (*010*)ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;
  (*014*)SubSystemData: Pointer;
  (*018*)ProcessHeap: Pointer;
  (*01c*)FastPebLock: PRTL_CRITICAL_SECTION;
  (*020*)FastPebLockRoutine: Pointer; // RtlEnterCriticalSection
  (*024*)FastPebUnlockRoutine: Pointer; // RtlLeaveCriticalSection
  (*028*)EnvironmentUpdateCount: ULONG;
  (*02c*)KernelCallbackTable: Pointer; // List of callback functions
  (*030*)SystemReserved: array[0..0] of ULONG;
  (*034*)AtlThunkSListPtr32: Pointer; // (Windows XP)
  (*038*)FreeList: PPEB_FREE_BLOCK;
  (*03c*)TlsExpansionCounter: ULONG;
  (*040*)TlsBitmap: Pointer; // ntdll!TlsBitMap of type PRTL_BITMAP
  (*044*)TlsBitmapBits: array[0..1] of ULONG; // 64 bits
  (*04c*)ReadOnlySharedMemoryBase: Pointer;
  (*050*)ReadOnlySharedMemoryHeap: Pointer;
  (*054*)ReadOnlyStaticServerData: PTEXT_INFO;
  (*058*)AnsiCodePageData: Pointer;
  (*05c*)OemCodePageData: Pointer;
  (*060*)UnicodeCaseTableData: Pointer;
  (*064*)NumberOfProcessors: ULONG;
  (*068*)NtGlobalFlag: ULONG;
  (*06C*)Unknown01: ULONG; // Padding or something
  (*070*)CriticalSectionTimeout: LARGE_INTEGER;
  (*078*)HeapSegmentReserve: ULONG;
  (*07c*)HeapSegmentCommit: ULONG;
  (*080*)HeapDeCommitTotalFreeThreshold: ULONG;
  (*084*)HeapDeCommitFreeBlockThreshold: ULONG;
  (*088*)NumberOfHeaps: ULONG;
  (*08c*)MaximumNumberOfHeaps: ULONG;
  (*090*)ProcessHeaps: Pointer;
  (*094*)GdiSharedHandleTable: Pointer;
  (*098*)ProcessStarterHelper: Pointer;
  (*09c*)GdiDCAttributeList: ULONG;
  (*0a0*)LoaderLock: PRTL_CRITICAL_SECTION;
  (*0a4*)OSMajorVersion: ULONG;
  (*0a8*)OSMinorVersion: ULONG;
  (*0ac*)OSBuildNumber: Word;
  (*0ae*)OSCSDVersion: Word;
  (*0b0*)OSPlatformId: ULONG;
  (*0b4*)ImageSubsystem: ULONG;
  (*0b8*)ImageSubsystemMajorVersion: ULONG;
  (*0bc*)ImageSubsystemMinorVersion: ULONG;
  (*0c0*)ImageProcessAffinityMask: ULONG;
  (*0c4*)GdiHandleBuffer: array[0..33] of Cardinal;
  (*14c*)PostProcessInitRoutine: Pointer;
  (*150*)TlsExpansionBitmap: Pointer;
  (*154*)TlsExpansionBitmapBits: array[0..31] of ULONG;
  (*1d4*)SessionId: ULONG;
  // Windows XP
  (*1d8*)AppCompatFlags: ULARGE_INTEGER;
  (*1e0*)AppCompatFlagsUser: ULARGE_INTEGER;
  (*1e8*)pShimData: Pointer;
  (*1ec*)AppCompatInfo: Pointer;
  (*1f0*)CSDVersion: UNICODE_STRING;
  (*1f8*)ActivationContextData: Pointer; // PACTIVATION_CONTEXT_DATA
  (*1fc*)ProcessAssemblyStorageMap: Pointer; // PASSEMBLY_STORAGE_MAP
  (*200*)SystemDefaultActivationContextData: Pointer; // PACTIVATION_CONTEXT_DATA
  (*204*)SystemAssemblyStorageMap: Pointer; // PASSEMBLY_STORAGE_MAP
  (*208*)MinimumStackCommit: ULONG;
  end;

// Verified in W2K, WXP and W2K3 using WinDbg
  _PEB_2K3 = packed record // packed!
  (*000*)InheritedAddressSpace: BOOLEAN;
  (*001*)ReadImageFileExecOptions: BOOLEAN;
  (*002*)BeingDebugged: BOOLEAN;
  (*003*)SpareBool: BOOLEAN;
  (*004*)Mutant: Pointer;
  (*008*)ImageBaseAddress: Pointer;
  (*00c*)Ldr: PPEB_LDR_DATA;
  (*010*)ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;
  (*014*)SubSystemData: Pointer;
  (*018*)ProcessHeap: Pointer;
  (*01c*)FastPebLock: PRTL_CRITICAL_SECTION;
  (*020*)FastPebLockRoutine: Pointer; // RtlEnterCriticalSection
  (*024*)FastPebUnlockRoutine: Pointer; // RtlLeaveCriticalSection
  (*028*)EnvironmentUpdateCount: ULONG;
  (*02c*)KernelCallbackTable: Pointer; // List of callback functions
  (*030*)SystemReserved: array[0..0] of ULONG;
  (*034*)ExecuteOptions: ULONG; // 2 Bits used (Windows 2003)
  (*038*)FreeList: PPEB_FREE_BLOCK;
  (*03c*)TlsExpansionCounter: ULONG;
  (*040*)TlsBitmap: Pointer; // ntdll!TlsBitMap of type PRTL_BITMAP
  (*044*)TlsBitmapBits: array[0..1] of ULONG; // 64 bits
  (*04c*)ReadOnlySharedMemoryBase: Pointer;
  (*050*)ReadOnlySharedMemoryHeap: Pointer;
  (*054*)ReadOnlyStaticServerData: PTEXT_INFO;
  (*058*)AnsiCodePageData: Pointer;
  (*05c*)OemCodePageData: Pointer;
  (*060*)UnicodeCaseTableData: Pointer;
  (*064*)NumberOfProcessors: ULONG;
  (*068*)NtGlobalFlag: ULONG;
  (*06C*)Unknown01: ULONG; // Padding or something
  (*070*)CriticalSectionTimeout: LARGE_INTEGER;
  (*078*)HeapSegmentReserve: ULONG;
  (*07c*)HeapSegmentCommit: ULONG;
  (*080*)HeapDeCommitTotalFreeThreshold: ULONG;
  (*084*)HeapDeCommitFreeBlockThreshold: ULONG;
  (*088*)NumberOfHeaps: ULONG;
  (*08c*)MaximumNumberOfHeaps: ULONG;
  (*090*)ProcessHeaps: Pointer;
  (*094*)GdiSharedHandleTable: Pointer;
  (*098*)ProcessStarterHelper: Pointer;
  (*09c*)GdiDCAttributeList: ULONG;
  (*0a0*)LoaderLock: PRTL_CRITICAL_SECTION;
  (*0a4*)OSMajorVersion: ULONG;
  (*0a8*)OSMinorVersion: ULONG;
  (*0ac*)OSBuildNumber: Word;
  (*0ae*)OSCSDVersion: Word;
  (*0b0*)OSPlatformId: ULONG;
  (*0b4*)ImageSubsystem: ULONG;
  (*0b8*)ImageSubsystemMajorVersion: ULONG;
  (*0bc*)ImageSubsystemMinorVersion: ULONG;
  (*0c0*)ImageProcessAffinityMask: ULONG;
  (*0c4*)GdiHandleBuffer: array[0..33] of Cardinal;
  (*14c*)PostProcessInitRoutine: Pointer;
  (*150*)TlsExpansionBitmap: Pointer;
  (*154*)TlsExpansionBitmapBits: array[0..31] of ULONG;
  (*1d4*)SessionId: ULONG;
  // Windows XP
  (*1d8*)AppCompatFlags: ULARGE_INTEGER;
  (*1e0*)AppCompatFlagsUser: ULARGE_INTEGER;
  (*1e8*)pShimData: Pointer;
  (*1ec*)AppCompatInfo: Pointer;
  (*1f0*)CSDVersion: UNICODE_STRING;
  (*1f8*)ActivationContextData: Pointer; // PACTIVATION_CONTEXT_DATA
  (*1fc*)ProcessAssemblyStorageMap: Pointer; // PASSEMBLY_STORAGE_MAP
  (*200*)SystemDefaultActivationContextData: Pointer; // PACTIVATION_CONTEXT_DATA
  (*204*)SystemAssemblyStorageMap: Pointer; // PASSEMBLY_STORAGE_MAP
  (*208*)MinimumStackCommit: ULONG;
  // New members in Windows 2003
  (*20c*)FlsCallback: Pointer;
  (*210*)FlsListHead: LIST_ENTRY;
  (*218*)FlsBitmap: Pointer;
  (*21c*)FlsBitmapBits: array[0..3] of ULONG;
  (*22c*)FlsHighIndex: ULONG;
  end;

(*{$IFDEF WINNT4}
  _PEB = _PEB_W2K; // Exact layout for NT4 unknown
{$ENDIF}

{$IFDEF WIN2000}
  _PEB = _PEB_W2K;
{$ENDIF}

{$IFDEF WINXP}    *)

  _PEB = _PEB_WXP;
(*{$ENDIF}

{$IFDEF WIN2003}
  _PEB = _PEB_2K3;
{$ENDIF}   *)

  PEB = _PEB;
  PPEB = ^_PEB;
  PPPEB = ^PPEB;

function CreateRemoteThread(hProcess: Cardinal;
  lpThreadAttributes: LPSECURITY_ATTRIBUTES; dwStackSize: DWord;
  lpStartAddress: LPTHREAD_START_ROUTINE; lpParameter: Pointer;
  dwCreationFlags: DWord; var lpThreadId: LPDWord): Cardinal;

implementation

function NT_SUCCESS(Status: Longint): Boolean;
begin
  Result := Status >= 0;
end;

function NtCurrentPEB: PPEB;
asm
  mov EAX, FS:[018h]
  mov EAX, [EAX+030h]
end;

function NtAllocateVirtualMemory(
    ProcessHandle: Cardinal;
    BaseAddress: Pointer;
    ZeroBits: ULong;
    AllocationSize: PULong;
    AllocationType: ULong;
    Protect: ULong
  ): Longint; stdcall; external 'ntdll.dll';
function NtFreeVirtualMemory(
    ProcessHandle: Cardinal;
    BaseAddress: Pointer;
    FreeSize: PULong;
    FreeType: ULong
  ): Longint; stdcall; external 'ntdll.dll';
function NtProtectVirtualMemory(
    ProcessHandle: Cardinal;
    BaseAddress: Pointer;
    ProtectSize: PULong;
    NewProtect: ULong;
    OldProtect: PULong
  ): Longint; stdcall; external 'ntdll.dll';
procedure RtlEnterCriticalSection(
    lpCriticalSection : PRTL_CRITICAL_SECTION
  ); stdcall; external 'ntdll.dll';

function CreateRemoteThread(hProcess: Cardinal;
  lpThreadAttributes: LPSECURITY_ATTRIBUTES; dwStackSize: DWord;
  lpStartAddress: LPTHREAD_START_ROUTINE; lpParameter: Pointer;
  dwCreationFlags: DWord; var lpThreadId: LPDWord): Cardinal;

procedure ThreadAttachDlls;
var
  ModuleListHead: PLISTENTRY;
  Entry: PLISTENTRY;
  Module: PLDR_MODULE;
  EntryPointer: PDLLMAIN_FUNC;
begin
   RtlEnterCriticalSection(NtCurrentPeb.LoaderLock);

   ModuleListHead := @NtCurrentPeb.Ldr.InInitializationOrderModuleList;
   Entry := ModuleListHead.Blink;

   while (Entry <> ModuleListHead) do
   begin
     Module := CONTAINING_RECORD(Entry, LDR_MODULE, InInitializationOrderModuleList);

      if (Module.EntryPoint <> 0) then
      begin
        Entrypoint := PDLLMAIN_FUNC(Module.EntryPoint);
        Entrypoint(Module.BaseAddress, DLL_THREAD_ATTACH, nil);
      end;

      Entry := Entry.Blink;
   end;

   RtlLeaveCriticalSection(NtCurrentPeb.LoaderLock);
end;

procedure ThreadStartup(lpStartAddress: LPTHREAD_START_ROUTINE;
  lpParameter: Pointer); stdcall;
var
  uExitCode: UInt;
begin
  ThreadAttachDlls;
  uExitCode := (lpStartAddress)(lpParameter);
  ExitThread(uExitCode);
end;

var
  ThreadHandle: Cardinal;
  ObjectAttributes: OBJECT_ATTRIBUTES;
  ClientId: CLIENT_ID;
  ThreadContext: CONTEXT;
  InitialTeb: INITIAL_TEB;
  CreateSuspended: Boolean;
  BaseAddress: Pointer;
  OldPageProtection: ULong;
  Status: Cardinal;
begin
  ObjectAttributes.Length := sizeof(OBJECT_ATTRIBUTES);
  ObjectAttributes.RootDirectory := 0;
  ObjectAttributes.ObjectName := nil;
  ObjectAttributes.Attributes := 0;
  if (Assigned(lpThreadAttributes)) then
  begin
     if (lpThreadAttributes.bInheritHandle) then
    begin
       ObjectAttributes.Attributes := $00000002;
    end;
     ObjectAttributes.SecurityDescriptor :=
      lpThreadAttributes.lpSecurityDescriptor;
  end;
  ObjectAttributes.SecurityQualityOfService := nil;

  { 1 } if ((dwCreationFlags or CREATE_SUSPENDED) = CREATE_SUSPENDED) then
  begin
    CreateSuspended := true;
  end
    else
  begin
    CreateSuspended := false;
  end;

  {InitialTeb.StackReserve = 0x100000; /* 1MByte */
  /* FIXME: use correct commit size */
  #if 0
    InitialTeb.StackCommit = (dwStackSize == 0) ? PAGESIZE : dwStackSize;
  #endif
    InitialTeb.StackCommit = InitialTeb.StackReserve - PAGESIZE;

  /* size of guard page */
  InitialTeb.StackCommit += PAGESIZE;}

  InitialTeb.StackAllocate := nil;

  Status := NtAllocateVirtualMemory(hProcess, @InitialTeb.StackAllocate, 0,
    @InitialTeb.StackReserve, MEM_RESERVE, PAGE_READWRITE);
  if (not NT_SUCCESS(Status)) then
  begin
    Result := 0;
    Exit;
  end;

  {InitialTeb.StackBase = (PVOID)((ULONG)InitialTeb.StackAllocate + InitialTeb.StackReserve);
  InitialTeb.StackLimit = (PVOID)((ULONG)InitialTeb.StackBase - InitialTeb.StackCommit);}


  Status := NtAllocateVirtualMemory(hProcess, @InitialTeb.StackLimit, 0,
    @InitialTeb.StackCommit, MEM_COMMIT, PAGE_READWRITE);
  if (not NT_SUCCESS(Status)) then
  begin
    NtFreeVirtualMemory(hProcess, InitialTeb.StackAllocate,
      @InitialTeb.StackReserve, MEM_RELEASE);

    Result := 0;
    Exit;
  end;

  Status := NtProtectVirtualMemory(hProcess, InitialTeb.StackLimit,
    PAGESIZE, PAGE_GUARD or PAGE_READWRITE, @OldPageProtection);
  if (not NT_SUCCESS(Status)) then
  begin
    NtFreeVirtualMemory(hProcess, InitialTeb.StackAllocate,
      @InitialTeb.StackReserve, MEM_RELEASE);

    Result := 0;
    Exit;
  end;

  memset(@ThreadContext, 0, sizeof(CONTEXT));
  ThreadContext.Eip := Longint(ThreadStartup);
  ThreadContext.SegGs := USER_DS;
  ThreadContext.SegFs := TEB_SELECTOR;
  ThreadContext.SegEs := USER_DS;
  ThreadContext.SegDs := USER_DS;
  ThreadContext.SegCs := USER_CS;
  ThreadContext.SegSs := USER_DS;
  {ThreadContext.Esp = (ULONG)InitialTeb.StackBase - 12;
  ThreadContext.EFlags = (1<<1) + (1<<9);

  *((PULONG)((ULONG)InitialTeb.StackBase - 4)) = (ULONG)lpParameter;
  *((PULONG)((ULONG)InitialTeb.StackBase - 8)) = (ULONG)lpStartAddress;
  *((PULONG)((ULONG)InitialTeb.StackBase - 12)) = 0xdeadbeef;}


  Status := NtCreateThread(@ThreadHandle, THREAD_ALL_ACCESS,
    @ObjectAttributes, hProcess, @ClientId, @ThreadContext,
    @InitialTeb, CreateSuspended);
end;

(*
  Status = NtCreateThread(&ThreadHandle,
           THREAD_ALL_ACCESS,
           &ObjectAttributes,
           hProcess,
           &ClientId,
           &ThreadContext,
           &InitialTeb,
           CreateSuspended);
  if (!NT_SUCCESS(Status))
    {
      NtFreeVirtualMemory(hProcess,
           InitialTeb.StackAllocate,
           &InitialTeb.StackReserve,
           MEM_RELEASE);

      DPRINT("NtCreateThread() failed!\n");
      SetLastErrorByStatus(Status);
      return(NULL);
    }

  if (lpThreadId != NULL)
    memcpy(lpThreadId, &ClientId.UniqueThread,sizeof(ULONG));

  return(ThreadHandle);
}
*)
Gruß
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Unit von C++ nach Delphi

  Alt 30. Okt 2007, 17:41
warum definierst du _SECURITY_ATTRIBUTES etc.? das gibts doch schon alles.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Unit von C++ nach Delphi

  Alt 30. Okt 2007, 21:07
Einige Sachen allerdings nicht .. Security Attributes schon, das war wohl überflüssig. Besonders die PEB Deklaration allerdings macht mir schwierigkeiten =/

Zumdem halt einige C++ spezifische Syntaxelemente.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

Re: Unit von C++ nach Delphi

  Alt 30. Okt 2007, 21:28
Zitat:

Bitte beachten Sie, dass sich ReactOS 0.3.3 noch in der alpha-Phase befindet und es derzeit nicht empfehlenswert ist, es für die tägliche Arbeit zu verwenden.

Was willst Du mit ReactOS? Läuft DELPHI auf diesem BS?
  Mit Zitat antworten Zitat
Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Unit von C++ nach Delphi

  Alt 30. Okt 2007, 21:54
Zitat von hathor:
Zitat:

Bitte beachten Sie, dass sich ReactOS 0.3.3 noch in der alpha-Phase befindet und es derzeit nicht empfehlenswert ist, es für die tägliche Arbeit zu verwenden.

Was willst Du mit ReactOS? Läuft DELPHI auf diesem BS?
Dir ist möglicherweise entgangen das ReactOS ein Betriebssystem ist das Windows sehr ähnlich ist, es kann unter anderem Exe-Dateien ausführen (hat einen eigenen Windows Loader, etc.) und es ist Open Source. Und mit diesem Code kannst du manche Windows (Native) Api's leichter verstehen, was sie machen und wozu. Mir hat zum Beispiel ReactOS sehr geholfen bei der Entwicklung von diversen PE-sachen.

Danke und Gute Nacht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz