Coder Jozu

I believe --- 这里坚持原创,拒绝转贴

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  13 随笔 :: 4 文章 :: 87 评论 :: 1 Trackbacks
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(4)

随笔分类

随笔档案

文章分类

文章档案

东接西链

搜索

最新评论

阅读排行榜

评论排行榜

sysinternals的dbgview想必大家都用过,我写了一个简单的,只监视user层OutputDebugString的输出,原理都包含在代码里了,希望对你有帮助,没有的话就算了:P
// DBMntor.cpp : Little dbgview。。。。
// Coder Jozu
//
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

#define PAGE_SIZE   4096

#define DBWIN_MAP   "DBWIN_BUFFER"
#define DBWIN_WRITEVENT  "DBWIN_BUFFER_READY"
#define DBWIN_READEVENT  "DBWIN_DATA_READY"

typedef struct _tag_DBMap
{
 DWORD dwProcessId;
 CHAR szString[PAGE_SIZE - sizeof(DWORD)];
} DB_MAP, *PDB_MAP;

int main(int argc, char* argv[])
{
 HANDLE hMap;
 PDB_MAP pDBMap;

 HANDLE hEventRead;
 HANDLE hEventWrite;
 HANDLE hMutex;

 hMutex = CreateMutex(NULL, FALSE, "DBWinMutex");

 hEventRead = CreateEvent(NULL, TRUE, FALSE, DBWIN_READEVENT);
 hEventWrite = CreateEvent(NULL, TRUE, FALSE, DBWIN_WRITEVENT);
 if(!hEventRead || !hEventWrite)
 {
  return 0;
 }

 hMap = CreateFileMapping(INVALID_HANDLE_VALUE,
        NULL,
        PAGE_READONLY,
        0,
        PAGE_SIZE,
        DBWIN_MAP);
 if(!hMap)
  return 0;

 pDBMap = (PDB_MAP)MapViewOfFile(hMap,
        FILE_MAP_READ,
        0,
        0,
        0);
 if(!pDBMap)
 {
  CloseHandle(hMap);
  return 0;
 }

 SetEvent(hEventWrite);
 while(TRUE)
 {
  
  WaitForSingleObject(hEventRead, INFINITE);
  
  printf("%d==>%s\n", pDBMap->dwProcessId, pDBMap->szString);
  
 }

 return 0;
}

posted on 2005-03-23 10:55 Coder Jozu 阅读(5244) 评论(19)  编辑 收藏

评论

# 肘子,你说假如HOOK下面这个函数可以获得系统的DEBUGSTRING吗? 2005-03-23 11:11 七猫的垃圾箱
BOOLEAN
KdpPrintString (
    IN PSTRING Output
    )

/*++

Routine Description:

    This routine prints a string.

Arguments:

    Output - Supplies a pointer to a string descriptor for the output string.

Return Value:

    TRUE if Control-C present in input buffer after print is done.
    FALSE otherwise.

--*/

{

    ULONG Length;
    STRING MessageData;
    STRING MessageHeader;
    DBGKD_DEBUG_IO DebugIo;

    //
    // Move the output string to the message buffer.
    //

    Length = KdpMoveMemory(
                (PCHAR)KdpMessageBuffer,
                (PCHAR)Output->Buffer,
                Output->Length
                );

    //
    // If the total message length is greater than the maximum packet size,
    // then truncate the output string.
    //

    if ((sizeof(DBGKD_DEBUG_IO) + Length) > PACKET_MAX_SIZE) {
        Length = PACKET_MAX_SIZE - sizeof(DBGKD_DEBUG_IO);
    }

    //
    // Construct the print string message and message descriptor.
    //

    DebugIo.ApiNumber = DbgKdPrintStringApi;
    DebugIo.ProcessorLevel = KeProcessorLevel;
    DebugIo.Processor = (USHORT)KeGetCurrentPrcb()->Number;
    DebugIo.u.PrintString.LengthOfString = Length;
    MessageHeader.Length = sizeof(DBGKD_DEBUG_IO);
    MessageHeader.Buffer = (PCHAR)&DebugIo;

    //
    // Construct the print string data and data descriptor.
    //

    MessageData.Length = (USHORT)Length;
    MessageData.Buffer = KdpMessageBuffer;

    //
    // Send packet to the kernel debugger on the host machine.
    //

    KdpSendPacket(
                  PACKET_TYPE_KD_DEBUG_IO,
                  &MessageHeader,
                  &MessageData
                  );

    return KdpPollBreakInWithPortLock();
}

# 应该是不行,这个函数是通过serial口传递调试信息的 2005-03-23 11:28 Coder Jozu
rt

# dbgview用的什么办法,有研究过吗?我觉得那个公司好NB呀? 2005-03-23 11:41 七猫的垃圾箱
rt

# 呵呵,那可是三个大牛人啊 2005-03-23 11:46 Coder Jozu
我这个方法就是从他里面摘得,内核级的他们都用得类似的技术,要写driver,我懒得写,呵呵


# 但他不止取得用户级别的呀,他连内核 的都有,难道他有个驱动? 2005-03-23 11:48 七猫的垃圾箱
rt

# 没错,是个driver,设备名是\device\dbgv 2005-03-23 11:53 Coder Jozu
rt

# 肘子,你上次的贴的端口对应进程的代码能再贴一次吗?我写了个,老不稳定,有时候蓝屏(我写了个小驱动) 2005-03-23 12:00 七猫的垃圾箱
rt

# 那个sysinternals网站上提供了这个东西的源代码 2005-03-23 12:05 coder jozu
好像叫netstatp,三环的,你可以参考看看


# 我想要个2K的。 2005-03-23 12:06 七猫的垃圾箱
rt

# re: 简单的debugview 2005-03-23 12:07 七猫的垃圾箱
Wonder how TCPView works? Netstatp is a program with source that demonstrates how to program some of TCPView's functionality. It shows how to use IP Helper interfaces, documented in MSDN, to obtain a list of TCP/IP endpoints. Note, however, that netstatp doesn't show process names on NT 4 and Win2K like TCPView and TCPVCon. 

# 哦,这个倒是个问题,20cn上也有一个,不过也不是很好 2005-03-23 13:08 coder jozu
我那个代码也不是很稳定,你的那个蓝苹是怎么一回事?

# 一开始我直接在驱动里读,老是读到PAGED_POOL里去,后来加了东东,又出现了PFN_LIST_CORRUPT,后来放到用户区,有时候 2005-03-23 13:18 七猫的垃圾箱
MMgetphysical这个函数居然会出异常

# 你是用object读的还是用handle读的? 2005-03-23 13:40 Coder jozu
PAGED_POOL这个也可以读,不过要在passive上才能读。
PFN_LIST_CORRUPT。。。你用了mdl去读数据么?这个是因为页面的问题。
MMgetphysical-看来你的代码运行级别比较高,上面的错误都是由于在较高的级别上访问分页内存造成的

# re: 简单的debugview 2005-03-23 14:01 七猫的垃圾箱
嗯,可能我MDL用的不好。光LOCK不UNLOCK会出错,但我又用TRY又LOCK,UNLOCK,还是出错。所以后来放弃了,

MMgetphysical会异常我到现在还想不通,后来我把这个函数前后加了try,except跑了几天还没出问题。


# 错误主要是这样的。 2005-03-23 14:08 七猫的垃圾箱

1、PAGE_FAULT_IN_NONPAGED_AREA错,该错用__try,__except亦无用,
pmdl=IoAllocateMdl;
MmBuildMdlForNonPagedPool(pmdl);
MmProbeAndLockPages(pmdl,KernelMode,IoReadAccess);


2、PFN_LIST_CORRUPT错误7:由于多写了一行:MmUnlockPages(不过后来发现不写的话会LOCK住内存,IoFreeMdl不会自动UNLOCK)


3、IRQL_NOT_LESS_OR_EQUAL:


由于少写了MmBuildMdlForNonPagedPool

最后还是不行。


# hehe,那具体的我可猜不到了 2005-03-23 14:11 Coder Jozu
总的感觉像是你在比较高的级别上调用了低级别的东西。如果这几个函数都在passive级别上应该都没有问题

# 啊,这个就明显多了 2005-03-23 14:21 Coder jozu
1。DPC级别上不能产生页错误,因为页错误处理运行在<=DPC级别上。
2。PFN_LIST_CORRUPT中PFN是指页面桢数据库的号,这个错误的详细信息你可以到osr上面去查,感觉是list头出了问题
3。明显的是由于你在IRQL级别高的地方调用了不该调用的函数

# 第1个错误我就是在DPC级别上运行的,这个错误很讨厌,不能tr 2005-03-23 14:33 七猫的垃圾箱
PFN_LIST_CORRUPT错误的具体信息我查到了,但我不知道为什么会有这个错。我要是不UNLOCKMDL的话就不会发生。

# 写错了,是因为MmUnlockPages报的错。 2005-03-23 14:35 七猫的垃圾箱
rt

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]