-
-
[讨论]想自己调用SSDT SHADOW 服务函数实现截图功能
-
发表于:
2008-5-20 08:58
8777
-
[讨论]想自己调用SSDT SHADOW 服务函数实现截图功能
粗粗查了下 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的我很不适应...
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!