2016-04-08 11 views
0

実行時にドライブ上のテキストドキュメントにメモ帳をダンプします。これは、ファイルを検索してキーワードを探し、エンドユーザーに見つかった場合に警告することができるため、重要です。Visual Basicで他の実行中のプロセスをダンプする

この私が現在持っているコード:

Private Const ProcessQueryInformation As Integer = &H400 
Private Const ProcessVmRead As Integer = &H10 

<DllImport("dbghelp", CallingConvention:=CallingConvention.Winapi, SetLastError:=True)> 
Private Shared Function MiniDumpWriteDump(
    ByVal hProcess As SafeFileHandle, 
    ByVal processId As Int32, 
    ByVal hFile As SafeFileHandle, 
    ByVal dumpType As MinidumpType, 
    ByVal exceptionParam As IntPtr, 
    ByVal userStreamParam As IntPtr, 
    ByVal callbackParam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean 
End Function 

<DllImport("kernel32", CallingConvention:=CallingConvention.Winapi, SetLastError:=True)> 
Public Shared Function OpenProcess(
    ByVal dwDesiredAccess As UInteger, 
    ByVal bInheritHandle As Boolean, 
    ByVal dwProcessId As Integer) As SafeFileHandle 
End Function 

<Flags()> 
Private Enum MinidumpType 
    MiniDumpNormal = 0 
    MiniDumpWithDataSegs = 1 
    MiniDumpWithFullMemory = 2 
    MiniDumpWithHandleData = 4 
    MiniDumpFilterMemory = 8 
    MiniDumpScanMemory = &H10 
    MiniDumpWithUnloadedModules = &H20 
    MiniDumpWithIndirectlyReferencedMemory = &H40 
    MiniDumpFilterModulePaths = &H80 
    MiniDumpWithProcessThreadData = &H100 
    MiniDumpWithPrivateReadWriteMemory = &H200 
    MiniDumpWithoutOptionalData = &H400 
    MiniDumpWithFullMemoryInfo = &H800 
    MiniDumpWithThreadInfo = &H1000 
    MiniDumpWithCodeSegs = &H2000 
    MiniDumpWithoutAuxiliaryState = &H4000 
    MiniDumpWithFullAuxiliaryState = &H8000 
End Enum 


Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 
    ' Get the process id. 
    Dim id As Integer = GetProcessId("notepad") 
    ' Get the process handle from the id. 
    Dim hProcess As SafeFileHandle = Nothing ' We could define a SafeProcessHandle...  
    Try 
     hProcess = OpenProcess(ProcessVmRead Or ProcessQueryInformation, False, id) 
     ' Check result... 
     If hProcess Is Nothing Then 
      If Marshal.GetLastWin32Error = 0 Then 
       Throw New Win32Exception 
      End If 
     End If 
     Dim oneFileName As String = "C:\dump.txt" 
     Using oneFile As FileStream = New FileStream(oneFileName, FileMode.Create) 
      MiniDumpWriteDump(hProcess, id, oneFile.SafeFileHandle, MinidumpType.MiniDumpWithFullMemory, 
           Nothing, Nothing, Nothing) 
      oneFile.Flush() 
     End Using 
    Finally 
     If hProcess IsNot Nothing Then 
      hProcess.Close() 
      hProcess.Dispose() 
     End If 
    End Try 
End Sub 

Private Function GetProcessId(ByVal processName As String) As Integer 
    Dim id As Integer = -1 
    Dim processes() As Process = Process.GetProcessesByName(processName) 
    If processes.Count = 0 Then Throw New ArgumentException("Could not find the process specified", "processName") 
    id = processes(0).Id ' There could be many processes - we just grab the first. 
    For Each p As Process In processes 
     p.Dispose() 
    Next 
    Return id 
End Function 

私の問題は、私はこのコードを実行するたびに、私は空白のテキストドキュメントを取得することです。私は関数MiniDumpWriteDumpがfalseを返していることを知っています、私はちょうど理由を理解できません - なぜ私はここにいるのですか?

あなたの情報については、これはすべてのプロセスで発生しますが、それ自体です。

+6

が、私はこの投稿のために非常に申し訳ありません - 私はMiniDumpWriteDumpを述べたように、すぐに解決策がポップアップ - ここ http://stackoverflow.com/questions/33868483/minidumpwritedump-c-produces-zero-length -dump-files-specific-process-rq = 1 – erawdaB

答えて

関連する問題