首页
社区
课程
招聘
[讨论]想自己调用SSDT SHADOW 服务函数实现截图功能
发表于: 2008-5-20 08:58 8777

[讨论]想自己调用SSDT SHADOW 服务函数实现截图功能

2008-5-20 08:58
8777
粗粗查了下 SSDT SHADOW 的几百个服务函数,突然发现了 NtGdiGetPixel()这个宝贝函数。
马上查找函数原型,找到原型:
typedef DWORD (*NtGdiGetPixel)(
    IN HDC hdc,
    IN INT x,
    IN INT y
);

于是凭借在ring3下编程的经验,想当然的以为,第一个参数传递 NULL,默认是传递整个屏幕的HDC。结果........
死得很温柔,调用返回-1,查看NtGdiGetPixel函数的代码,我靠
NtGdiGetPixel(HDC hDC, INT XPos, INT YPos)
{
        PDC dc = NULL;
        COLORREF Result = (COLORREF)CLR_INVALID; // default to failure, 就是-1了
        BOOL bInRect = FALSE;
        BITMAPOBJ *BitmapObject;
        SURFOBJ *SurfaceObject;
        HPALETTE Pal = 0;
        XLATEOBJ *XlateObj;
    HBITMAP hBmpTmp;

        dc = DC_LockDc (hDC);

        if ( !dc )
        {
                SetLastWin32Error(ERROR_INVALID_HANDLE);
                return Result;
        }

看来内核函数不是那么傻瓜化的
于是我想找个能获取整个屏幕HDC的函数,发现这个函数
HDESK NtUserCreateDesktop();
看样子是获取整个桌面?奇怪的是返回值类型 HDESK,查了下,HDESK就是HANDLE
看来又不行了。
郁闷,看来只能用 NtGdiDdGetDC()函数了,
这个函数倒不复杂:
HDC APIENTRY NtGdiDdGetDC(      
    HANDLE hSurface,
    PALETTEENTRY *puColorTable
);
但麻烦的是它的第一个参数,这个hSurface参数要通过调用 NtGdiDdCreateSurfaceObject ()或NtGdiDdCreateSurface ()获取,郁闷的是,这两个函数的参数涉及了一大堆复杂的内核结构,
顿时坠入云雾中...

有没有点简单的办法?或者提供些资料或现成的代码?如果照这路走下去,恐怕还要读一堆DDK文档.. 哎,郁闷死了
而且网上关于SSDT SHADOW 服务函数的示例代码很少,让习惯COPY的我很不适应...

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
刚又在SSDT SHADOW中发现了
HDC
NTAPI
NtUserGetDC(
  HWND hWnd);   

这个函数似乎不错,搞搞看看吧。嘿嘿
2008-5-20 09:13
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
成功了。。。。。
2008-5-20 09:49
0
雪    币: 334
活跃值: (247)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
4
很经典的自问自答贴,强贴留名.
2008-5-21 16:09
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
先 NtUserGetDC 取得屏幕或者桌面的DC,
再用 NtGdiGetPixel 取色

NtUserCreateDesktop 是创建多桌面
2008-5-22 16:15
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
6
有用,标记下!
2008-5-22 19:53
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
自已动手...
2008-5-27 12:36
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好东西,感谢
2008-5-28 20:44
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
学习...做记号~~
2008-5-29 13:32
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不错不错,学习
2008-5-29 16:07
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
。。。留名``
2008-6-17 02:53
0
雪    币: 7
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了..留个标记.
2008-7-5 18:05
0
游客
登录 | 注册 方可回帖
返回
//