-2

プロセスIDを返すための新しい使用法のため?また、アプリケーションのデバッグ全体を通して、メモリがリークし始めた時期を確認するにはどうすればよいですか?(説明セクションのこの長さチェックは本当に= Pを吸います)

#include "stdafx.h"
#include "Process.h"
#include <TlHelp32.h>
#include <iostream>



DWORD GetProcessId( const wchar_t* szProcess )
{
    if( szProcess )
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        PROCESSENTRY32 *pe32 = new PROCESSENTRY32();
        memset( pe32, 0, sizeof( PROCESSENTRY32 ) );
        pe32->dwSize = sizeof( PROCESSENTRY32 );
        //Process32First( hSnapshot, pe32 );
        while( Process32Next( hSnapshot, pe32 ) )
        {
            if( pe32->szExeFile && !wcscmp( szProcess, pe32->szExeFile ) )
            {
                CloseHandle( hSnapshot );
                return( pe32->th32ProcessID ); //   std::wcout << pe32->szExeFile << std::endl;
            }
        }
        CloseHandle( hSnapshot );
    }
    return 0;
}

HANDLE GetProcessHandle( DWORD dwProcessId )
{
    if( dwProcessId )
        return( OpenProcess( PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId ) );

    return 0;
}

bool WriteExternProcessMemory( HANDLE hProcess, void* pAddr, size_t uSize, const char* szWrite, LPCVOID outBuffer )
{
    if( pAddr && szWrite && hProcess )
    {
        DWORD dwOldProtect;
        if( !VirtualProtectEx( hProcess, pAddr, uSize, PAGE_EXECUTE_READWRITE, &dwOldProtect ) )
            return( !WriteProcessMemory( hProcess, pAddr, outBuffer, uSize, NULL ) );
    }

    return false;
}

-編集、使用法は次のとおりです。

void *pRecv;
WriteExternProcessMemory( GetProcessHandle( GetProcessId( _T( "notepad.exe" ) ) ), (void*)0x401000, 2, "\x40\x40",  &pRecv );
4

3 に答える 3

7

これは漏れています:

PROCESSENTRY32 *pe32 = new PROCESSENTRY32();

より良い使用:

PROCESSENTRY32 pe32 = {0};
pe32.dwSize = sizeof( PROCESSENTRY32 );
//Process32First( hSnapshot, pe32 );
while( Process32Next( hSnapshot, &pe32 ) )
...

また、 で作成されたハンドルを閉じていませんGetProcessHandle。これもリークです。

于 2012-06-29T20:18:25.037 に答える
2

はい、あなたは正しいです。プログラムのように、後で解放せずにメモリを割り当てると、メモリ リークが発生します。

メモリ リーク検出器を使用して、プログラム内のリークを見つけることができます。

于 2012-06-29T20:18:59.217 に答える
2

Valgrind は、メモリ リークを知らせる素晴らしいツールです。デバッグ シンボル (GCC の場合は -g) を使用してコンパイルしている場合は、リークが発生した行もわかります。

http://valgrind.org/

于 2012-06-29T20:34:51.057 に答える