апи фунуция MiniDumpWriteDump

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
александр1
Сообщения: 4
Зарегистрирован: 19 окт 2009, 20:49

здравствуйте!
я пишу программу одну и застопорился на 1 месте
мне необходимо снять дамп одного системного .процесса, напрмер explorer.exe и выгрузить его в файл. всю инфу о процессе я знаю, id и др.

Код: Выделить всё

 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
а функцию эту никак применить не получается
вот ее описание:

Код: Выделить всё

BOOL MiniDumpWriteDump(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
1) первый параметр HANDLE hProcess я так понял получается из функции

Код: Выделить всё

HANDLE d=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
2) второй параметр это вроде pe32.th32ProcessID

3)получаем 3й параметр:

Код: Выделить всё

char block[_MAX_PATH];
    SYSTEMTIME st;
    GetLocalTime(&st);
    _snprintf(block, _MAX_PATH, "CrashDump-%04d%02d%02d%02d%02d%02d%03d.dmp", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
HANDLE hFile = CreateFile(
                        block, 
                        GENERIC_READ|GENERIC_WRITE, 
                        FILE_SHARE_READ, 
                        NULL,
                        CREATE_ALWAYS, 
                        FILE_ATTRIBUTE_NORMAL, 
                        NULL
                        );
4) 4 параметр будет равен MiniDumpWithFullMemory
5,6 и 7 параметры наверно будут равны NULL


Итого вот текст программы

Код: Выделить всё

// damp.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <dbghelp.h> 
#include <fstream>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{ 
 HANDLE hProcessSnap,d, pH = NULL;
 PROCESSENTRY32 pe32;
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 Process32First(hProcessSnap,&pe32);
 pH = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);
 MODULEENTRY32 mo = {sizeof(mo)};
 Module32First(pH,&mo);


 d=OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
 
 char block[_MAX_PATH];
    SYSTEMTIME st;
    GetLocalTime(&st);
    _snprintf(block, _MAX_PATH, "CrashDump-%04d%02d%02d%02d%02d%02d%03d.dmp", 
        st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
    HANDLE hProc = GetCurrentProcess();
    HANDLE hFile = CreateFile(
                        (LPCWSTR)block, 
                        GENERIC_READ|GENERIC_WRITE, 
                        FILE_SHARE_READ, 
                        NULL,
                        CREATE_ALWAYS, 
                        FILE_ATTRIBUTE_NORMAL, 
                        NULL
                        );

	BOOL ret = MiniDumpWriteDump(    
                        d, 
						pe32.th32ProcessID, 
                        hFile,
                        MiniDumpWithFullMemory,
                        NULL,
                        NULL,NULL);


 return 0;
}
Но она не компилируется,в чем ошибка не пойму :confused:
подскажите что не так?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

1. Какой компилятор?
2. Какая операционная система?
3. Какая именно ошибка?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
александр1
Сообщения: 4
Зарегистрирован: 19 окт 2009, 20:49

пишу на WS 2008 под Windows Mobile 2005
в окно аут пут пишет:

1>------ Build started: Project: damp, Configuration: Debug Windows Mobile 5.0 Pocket PC SDK (ARMV4I) ------
1>Linking...
1>damp.obj : error LNK2019: unresolved external symbol MiniDumpWriteDump referenced in function wmain
1>Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug/damp.exe : fatal error LNK1120: 1 unresolved externals
1>Build log was saved at "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2008\Projects\damp\damp\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\BuildLog.htm"
1>damp - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
========== Deploy: 0 succeeded, 0 failed, 0 skipped ==========
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Спецификацию функции MiniDumpWriteDump смотрел? Вот тут, например.

Там в требованиях стоит "DbgHelp.dll 5.1 or later". Для PC линейки нужная версия dll повилась только в Windows XP SP3, Windows 2003 Serv SP2. Очень сомневаюсь, что у тебя есть подходящая версия этой dll на Windows Mobile.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
александр1
Сообщения: 4
Зарегистрирован: 19 окт 2009, 20:49

а как тогда это можно реализовать на Windows Mobile?
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):а как тогда это можно реализовать на Windows Mobile?
Сопри дллку с Windows XP SP3, киннь её в каталог своей проги и попробуй, что получится. Вдруг поможет?
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить