Дело в том что я не могу найти аналог для указателя для x64 на Delphi. Ведь Pointer на Delphi занимает 4 байта,а на x64 он должен занимать 8 байт (или я ошибаюсь?). Так же необходимо узнать является ли процесс 64 битным как это делает диспетчер задач (32 битные процессы помечает "*32") . П.С. Я заметил возникает такая ситуация когда процесс с определенным PID уже завершился, но OpenProcess все еще возвращает валидный handle. И после чтения ReadProcessMemory с использованием этого handl'а возвращается ошибка ERROR_PARTIAL_COPY что означает что не все данные были скопированы. Не подскажете как определить что процесс с данным PID уже завершился? Вариант с перечислением всех процессов и просмотром их PID не предлагать. Завершен ли процесс с данным PID может определить "Монитор ресурсов" (Его можно вызвать из Диспетчера задач с вкладки "Быстродействие" в Windows 7).
Если ты про PVOID из структуры, то да, и это описано на мсдн: http://msdn.microsoft.com/en-us/library/aa985900(v=vs.80).aspx Попробуй IsWow64Process воспользоваться ERROR_PARTIAL_COPY может возвращаться при некоторых операциях из 32-битного процесса с 64-битным. Может дело в этом?
WaterGhost Завязывайте с Дельфе. Это бесперспективное дерьмо. Причем её надо вызывать динамически. Ежели конечно у вас там все остальное не хардкод и прочий гуан.
struc PEB ;Structure: PEB { .dbInheritedAddressSpace db ? .dbReadImageFileExecOptions db ? .dbBeingDebugged db ? .dbBitField db ? dd ? .pntrMutant dq ? .pntrImageBaseAddress dq ? .pntrLdr dq ? .pntrProcessParameters dq ? .pntrSubSystemData dq ? .pntrProcessHeap dq ? .pntrFastPebLock dq ? .pntrAtlThunkSListPtr dq ? .pntrSparePtr dq ? .pntrEnvironmentUpdateCount dq ? .pntrKernelCallbackTable dq ? .dqSystemReserved0 dq ? .pntrFreeList dq ? .dqTlsExpansionCounter dq ? .pntrTlsBitmap dq ? .dqTlsBitmapBits dq ? .pntrReadOnlySharedMemoryBase dq ? .pntrReadOnlySharedMemoryHeap dq ? .pntrReadOnlyStaticServerData dq ? .pntrAnsiCodePageData dq ? .pntrOemCodePageData dq ? .pntrUnicodeCaseTableData dq ? .ddNumberOfProcessors dd ? .ddNtGlobalFlag dd ? .dqCriticalSectionTimeout dq ? .dqHeapSegmentReserve dq ? .dqHeapSegmentCommit dq ? .dqHeapDeCommitTotalFree dq ? .dqHeapDeCommitFreeBlock dq ? .ddNumberOfHeaps dd ? .ddMaximumNumberOfHeaps dd ? .pntrProcessHeaps dq ? .pntrGdiSharedHandleTable dq ? .pntrProcessStarterHelper dq ? .pntrGdiDCAttributeList dq ? .pntrLoaderLock dq ? .ddOSMajorVersion dd ? .ddOSMinorVersion dd ? .ddOSBuildNumber dd ? .ddOSPlatformId dd ? .ddImageSubsystem dd ? .ddImageSubsystemMajorVersion dd ? .dqImageSubsystemMinorVersion dq ? .dqImageProcessAffinityMask dq ? .pntrGdiHandleBuffer dd 3ch dup (?) .pntrPostProcessInitRoutine dq ? .pntrTlsExpansionBitmap dq ? .pntrTlsExpansionBitmapBits dd 20h dup (?) .dqSessionId dq ? .dqAppCompatFlags dq ? .dqAppCompatFlagsUser dq ? .pntrShimData dq ? .pntrAppCompatInfo dq ? .szCSDVersion db 10h dup (?) .pntrActivationContextData dq ? .pntrProcessAssemblyStorageMap dq ? .pntrSystemDefaultActivContext dq ? .pntrSystemAssemblyStorageMap dq ? .dqMinimumStackCommit dq ? .pntrFlsCallback dq ? .pntrFlsListHead0 dq ? .pntrFlsListHead1 dq ? .pntrFlsBitmap dq ? .dqFlsBitmapBits0 dq ? .dqFlsBitmapBits1 dq ? .dqFlsHighIndex0 dq ? .dqFlsHighIndex1 dq ? } virtual at 0 strcPEB PEB @StrcPEBSize = ($ - strcPEB) end virtual вроде так
если приходится иметь дело с разными самопальными хидерами в стиле ntdll.h, то предпочитаю запустить WinDbg и вбить dt nt!_PEB (или какая структура интересует)
WaterGhost Ну да, нормальный 64-битный указатель. Или нужно в 32-разрядной прогой на Delphi разбирать дампы, сняты с 64-битных систем? Тогда вместо указателя можно использовать UInt64.