亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dcdtable.cpp

?? Windows 圖形編程 書籍
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//-----------------------------------------------------------------------------------//
//              Windows Graphics Programming: Win32 GDI and DirectDraw               //
//                             ISBN  0-13-086985-6                                   //
//                                                                                   //
//  Written            by  Yuan, Feng                             www.fengyuan.com   //
//  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
//  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
//                                                                                   //
//  FileName   : dcdtable.cpp					                                     //
//  Description: Decode GDI handle table, Chapter 3                                  //
//  Version    : 1.00.000, May 31, 2000                                              //
//-----------------------------------------------------------------------------------//

#define STRICT
#include <windows.h>
#include <assert.h>
#include <stdio.h>
#include <tchar.h>
#include <winioctl.h>

#include "dialog.h"
#include "gditable.h"
#include "fxstring.h"

#include "resource.h"
#include "handles.h"
#include "creator.h"
#include "dcdtable.h"
#include "device.h"
#include "MemDump.h"
#include "..\\Periscope\Periscope.h"

#define _WIN32_WINNT 0x0500

#include "dcattr.h"

KDecodeTablePage::KDecodeTablePage()
{
	m_hInst = NULL;
}


class KTemp
{
public:
	KString<512> mess;

	HGDIOBJ Select(HDC hDC, HGDIOBJ hHandle);
};


HGDIOBJ KTemp::Select(HDC hDC, HGDIOBJ hHandle)
{
	HGDIOBJ hRslt;

	if ( GetObjectType(hHandle) == OBJ_PAL )
	{
		hRslt = SelectPalette(hDC, (HPALETTE) hHandle, FALSE);
		mess.Append("SelectPalette() returns 0x%x", (unsigned) hRslt);
	}
	else
	{
		hRslt = SelectObject(hDC, hHandle);
		mess.Append("SelectObject() returns 0x%x", (unsigned) hRslt);
	}
	
//	assert(hRslt);
	return hRslt;
}


void KDecodeTablePage::TestnCount(int obj, HDC hDC1, HDC hDC2, bool testdelete)
{
	KTemp temp;
	BOOL rslt;

	// create an object
	HGDIOBJ hHandle = CreateObject(obj, hDC1);

	assert(hHandle);

	temp.mess.Append("Create...() returns 0x%x", (unsigned) hHandle);
	temp.mess.Append(", nCount=%d\r\n", m_GDITable.GetCount(hHandle));

	// select into a DC1
	HGDIOBJ hOld1 = temp.Select(hDC1, hHandle); 
	temp.mess.Append(" nCount=%d\r\n", m_GDITable.GetCount(hHandle));

	// select into a DC2
	HGDIOBJ hOld2 = temp.Select(hDC2, hHandle); 
	temp.mess.Append(" nCount=%d\r\n", m_GDITable.GetCount(hHandle));

	if ( testdelete )
	{
		rslt = DeleteObject(hHandle);
		temp.mess.Append("DeleteObject() returns %d\n", rslt);
	}
	
	// deselect from a DC2
	temp.mess.Append("(De)");
	temp.Select(hDC2, hOld2);
	temp.mess.Append(", nCount=%d\r\n", m_GDITable.GetCount(hHandle));

	// deselect from a DC1
	temp.mess.Append("(De)");
	temp.Select(hDC1, hOld1);
	temp.mess.Append(", nCount=%d\r\n", m_GDITable.GetCount(hHandle));

	rslt = DeleteObject(hHandle);
	temp.mess.Append("DeleteObject() returns %d", rslt);
	
	MessageBox(NULL, temp.mess, Commands[obj], MB_OK);
}


void KDecodeTablePage::TestnCount(bool testdelete)
{
	HDC hDC = GetDC(m_hWnd);
	HDC hMemDC1 = CreateCompatibleDC(hDC);
	HDC hMemDC2 = CreateCompatibleDC(hDC);

	TestnCount(obj_CreateSolidBrush,   hMemDC1, hMemDC2, testdelete);
	TestnCount(obj_CreatePen,		   hMemDC1, hMemDC2, testdelete);
	TestnCount(obj_CreateBitmap,	   hMemDC1, hMemDC2, testdelete);
	TestnCount(obj_CreateFont,		   hMemDC1, hMemDC2, testdelete);
	TestnCount(obj_CreatePalette,      hMemDC1, hMemDC2, testdelete);

	DeleteDC(hMemDC1);
	DeleteDC(hMemDC2);

	ReleaseDC(m_hWnd, hDC);
}


// check reuse of rectangle region
void KDecodeTablePage::TestpUserRectRegion(void)
{
	KString<1024> mess;

	for (int i=0; i<8; i++)
	{
		HRGN hRgn = CreateRectRgn(i, i, i+10, i+10);

		mess.Append("%d  ", i+1);
		mess.Append("%08lx\t",     (unsigned) hRgn);
		mess.Append("pKernel=%x\t", (unsigned) m_GDITable[hRgn].pKernel);
		mess.Append("pUser=%x  ",    (unsigned) m_GDITable[hRgn].pUser);

		RECT * pRect = (RECT *) ((unsigned char *)m_GDITable[hRgn].pUser+8);
		mess.Append("[%d, ", pRect->left);
        mess.Append("%d, ", pRect->top);
        mess.Append("%d, ", pRect->right);
        mess.Append("%d]\r\n", pRect->bottom);

		KString<128> t;
		t.Append("%x, ", (unsigned) m_GDITable[hRgn].pKernel);
		t.Append("%x, ",            m_GDITable[hRgn].nUpper);
		t.Append("%x ",  (unsigned) m_GDITable[hRgn].pUser);

		DeleteObject(hRgn);

		t.Append(" -> delete -> ");
		t.Append("%x, ", (unsigned) m_GDITable[hRgn].pKernel);
		t.Append("%x, ",            m_GDITable[hRgn].nUpper);
		t.Append("%x ",  (unsigned) m_GDITable[hRgn].pUser);

		OutputDebugString(t);
		OutputDebugString("\n");
	}

	MessageBox(NULL, mess, "CreateRectRgn", MB_OK);
}


void KDecodeTablePage::TestpUserSolidBrush(void)
{
	KString<1024> mess;

	for (int i=0; i<8; i++)
	{
		HGDIOBJ hBrush = CreateSolidBrush(RGB(i*32, i*32, i*32));

		mess.Append("%d  ", i+1);
		mess.Append("%08lx\t",     (unsigned) hBrush);
		mess.Append("pKernel=%x\t", (unsigned) m_GDITable[hBrush].pKernel);
		mess.Append("pUser=%x  ",    (unsigned) m_GDITable[hBrush].pUser);

		LOGBRUSH * pLogBrush = (LOGBRUSH *) m_GDITable[hBrush].pUser;
		mess.Append("color=%x\r\n", pLogBrush->lbColor);

	    OutputDebugString(mess);

        KString<128> t;
		t.Append("%x, ", (unsigned) m_GDITable[hBrush].pKernel);
		t.Append("%x, ",            m_GDITable[hBrush].nUpper);
		t.Append("%x ",  (unsigned) m_GDITable[hBrush].pUser);

		DeleteObject(hBrush);

		t.Append(" -> delete -> ");
		t.Append("%x, ", (unsigned) m_GDITable[hBrush].pKernel);
		t.Append("%x, ",            m_GDITable[hBrush].nUpper);
		t.Append("%x ",  (unsigned) m_GDITable[hBrush].pUser);

	//	OutputDebugString(t);
	//	OutputDebugString("\n");
	}

	MessageBox(NULL, mess, "CreateSolidBrush", MB_OK);
}


BOOL KDecodeTablePage::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	HWND hExp = GetDlgItem(hWnd, IDC_EXPERIMENT);

    switch (uMsg)
    {
	    case WM_INITDIALOG:
			m_hWnd = hWnd;
            
			m_Objects.FromDlgItem(hWnd, IDC_GDITABLE);
			
			m_Objects.AddColumn(0, 50, "Index");
			m_Objects.AddColumn(1, 90, "pKernel");
		
			m_Objects.AddColumn(2, 60, "nCount");
        	
			m_Objects.AddColumn(3, 60, "nProc");
		    
			m_Objects.AddColumn(4, 60, "nUpper");
			m_Objects.AddColumn(5, 60, "nType");

            m_Objects.AddColumn(6, 90, "pUser");

			SendMessage(hExp, CB_ADDSTRING, 0, (LPARAM) _T("Query GDI Table"));
			SendMessage(hExp, CB_ADDSTRING, 0, (LPARAM) _T("nCount: SelectObject"));
			SendMessage(hExp, CB_ADDSTRING, 0, (LPARAM) _T("nCount: DeleteObject"));
			SendMessage(hExp, CB_ADDSTRING, 0, (LPARAM) _T("pUser: CreateSolidBrush"));
            SendMessage(hExp, CB_ADDSTRING, 0, (LPARAM) _T("pUser: CreateRectRgn"));
            SendMessage(hExp, CB_ADDSTRING, 0, (LPARAM) _T("Dump GDI Table"));
			SendMessage(hExp, CB_SETCURSEL, 0, 0);
			return TRUE;
		
		case WM_COMMAND:
			if ( LOWORD(wParam) == IDC_GO )
			switch ( SendMessage(hExp, CB_GETCURSEL, 0, 0) )
			{
				case 0: Query();		   return TRUE;
				case 1: TestnCount(false); return TRUE;
				case 2: TestnCount(true);  return TRUE;
				case 3: TestpUserSolidBrush(); return TRUE;
                case 4: TestpUserRectRegion(); return TRUE;
                case 5: DumpGDITable(); return TRUE;
			}
			break;

		case WM_NOTIFY:
			if (wParam == IDC_GDITABLE)
			{
				NM_LISTVIEW * pInfo = (NM_LISTVIEW *) lParam;
				
				if ( (pInfo->hdr.code == NM_CLICK) && (pInfo->iItem != -1) )  
				{
					TCHAR sIndex[16];
					unsigned nIndex;

					m_Objects.GetItemText(pInfo->iItem, 0, sIndex, sizeof(sIndex));
					sscanf(sIndex, "%x", & nIndex);

					ShowDetails(nIndex);
					return TRUE;
				}
				else if ( (pInfo->hdr.code == NM_DBLCLK) && (pInfo->iItem != -1) )  
				{
					TCHAR sIndex[16];
					unsigned nIndex;

					m_Objects.GetItemText(pInfo->iItem, 0, sIndex, sizeof(sIndex));
					sscanf(sIndex, "%x", & nIndex);

				//	HDC hDC = GetDC(NULL);
				//	Modify((unsigned) hDC & 0x3FFF);
				//	ReleaseDC(NULL, hDC);

					Modify(nIndex);
					return TRUE;
				}
	
			}

			break;

		case WM_DESTROY:
			m_Objects.DeleteAll();
			break;
    }
    
    return FALSE;
}


void KDecodeTablePage::Query(void)
{
	m_Objects.DeleteAll();

	DWORD nProcId;

	// determine if user is interested in single process or all processes
	if ( SendDlgItemMessage(m_hWnd, IDC_PROCESSONLY, BM_GETCHECK, 0, 0) == BST_CHECKED ) 
		nProcId = GetCurrentProcessId();
	else
		nProcId = 0;

	for (int i=0; i<=0x3FFF; i++)
	{
		GDITableCell cell = m_GDITable[i];

		if ( (nProcId == 0) || (nProcId==m_GDITable.GetProcess(i)) ) // process matches
		if ( (unsigned) cell.pKernel >= 0x80000000 )	  // valid pointer to kernel address space
		{
			KString<64> s;

			m_Objects.AddItem(0, s.Format("%4x",  i));
			m_Objects.AddItem(1, s.Format("%8x",  (unsigned) cell.pKernel));
			m_Objects.AddItem(2, s.Format("%x",   m_GDITable.GetCount(i)));
			m_Objects.AddItem(3, s.Format("%x",   m_GDITable.GetProcess(i)));
			m_Objects.AddItem(4, s.Format("%04x", cell.nUpper));
			m_Objects.AddItem(5, s.Format("%04x", cell.nType));
			m_Objects.AddItem(6, s.Format("%x",   (unsigned) cell.pUser));
		}
	}
}


const char * GDIObjectTypeName(HGDIOBJ obj)
{
    static char rslt[32];

    switch ( HIWORD(obj) & 0x7F )
    {
        case 0x01: return "dc";
        case 0x04: return "region";
        case 0x05: return "bitmap";
        case 0x08: return "palette";
        case 0x0a: return "font";
        case 0x10: return "brush";
        case 0x21: return "enhmetafile";
        case 0x30: return "pen";
        case 0x50: return "extpen";
    
        default:   
            wsprintfA(rslt, "unknown(%xh)", HIWORD(obj) & 0x7F);
            return rslt;
    }
}


class KPeriscopeClient : public KDevice
{
public:
    KPeriscopeClient(const TCHAR * DeviceName) : KDevice(DeviceName)
    {
    }

    bool Read(void * dst, const void * src, unsigned len);
};


bool KPeriscopeClient::Read(void * dst, const void * src, unsigned len)
{
    unsigned      cmd[2] = { (unsigned) src, len };
    unsigned long dwRead;
   
    return IoControl(IOCTL_PERISCOPE, cmd, sizeof(cmd), dst, len, &dwRead) && (dwRead==len);
}


void KDecodeTablePage::DumpGDITable(void)
{
    bool pagetouched[16*256]; // 16 Mb in pages
    char temp[MAX_PATH];
    KMemDump  memdump;
        
    memset(pagetouched, 0, sizeof(pagetouched));

    memdump.OpenDump();
        
	for (int i=0; i<=0x3FFF; i++)
	{
		GDITableCell cell = m_GDITable[i];

		if ( (unsigned) cell.pKernel >= 0x80000000 )
		{
            wsprintf(temp, "%4x %8x %8x %s", i, cell.pKernel, cell.pUser, 
                GDIObjectTypeName((HGDIOBJ) MAKELONG(i, cell.nUpper)));
            memdump.Writeln(temp);

            unsigned addr = (unsigned) cell.pKernel;

            if ( (addr>>24)==0xE1 )
                pagetouched[(addr & 0xFFFFFF)>>12] = true;
		}
	}
    memdump.Newline();

    KPeriscopeClient scope("PeriScope");
    
    if ( scope.Load("c:\\periscope.sys")==ERROR_SUCCESS )
    {
        unsigned char buf[4096];

        for (i=0; i<4096; i++)
            if ( pagetouched[i] )
            {
                unsigned addr = 0xE1000000 + i * 4096;
                scope.Read(buf, (void *) addr, sizeof(buf));

                memdump.Dump(buf, addr - (unsigned)buf, 4096, sizeof(unsigned long));
                memdump.Newline();
            }
        
        memdump.CloseDump();
        
        scope.Close();
    }
    else
        MessageBox(NULL, "Unable to load periscope", NULL, MB_OK);
}


const LPCTSTR DCProperty[] =
{
	TEXT("GetBkColor/SetBkColor"),
	TEXT("GetBkMode/SetBkMode"),
	TEXT("GetPolyFillMode/SetPolyFillMode"),
	TEXT("GetRop2/SetRop2"),
	TEXT("GetStretchBltMode/SetStretchBltMode"),
	TEXT("GetTextColor/SetTextColor"),
	TEXT("GetMapMode/SetMapMode"),
	TEXT("GetViewportOrg/SetViewportOrg"),
	TEXT("GetViewportExt/SetViewportExt"),
	TEXT("GetWindowOrg/SetWindowOrg"),
	TEXT("GetWindowExt/SetWindowExt"),
	TEXT("GetClipBox/SetClipBox"),
	TEXT("GetTextAlign/SetTxtAlign"),
	TEXT("GetTextJustification/SetTextJustification"),
	TEXT("GetTextCharacterExtra/SetTextCharacterExtra"),
	TEXT("GetAspectRatioFilterEx/SetMapperFlags")
};
	

#define Cap(name) DeviceCap(#name, name)

class KDecodeDC
{
	unsigned * m_addr;
	unsigned buffer[sizeof(DCAttr)/sizeof(unsigned)];
	HDC		   m_hDC;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99视频有精品| 欧美国产一区在线| 欧美精品v日韩精品v韩国精品v| av资源站一区| 成人国产精品免费观看| a亚洲天堂av| 色哟哟亚洲精品| 色噜噜久久综合| 欧美影视一区二区三区| 欧美写真视频网站| 欧美日韩在线免费视频| 欧美三日本三级三级在线播放| 欧洲色大大久久| 欧美三级中文字幕| 在线电影院国产精品| 欧美一区三区四区| 日韩欧美一区在线| 久久综合999| 中文字幕国产一区| 亚洲欧美另类小说| 一区二区三区四区乱视频| 亚洲精品一二三| 亚洲一区电影777| 日韩在线一区二区三区| 久久精品国产一区二区| 国产精品18久久久久久久久| 成人中文字幕在线| 日本电影欧美片| 欧美久久久久久久久| 欧美不卡一区二区三区四区| 国产喂奶挤奶一区二区三区| 日韩理论片在线| 亚洲国产成人高清精品| 麻豆国产91在线播放| 国产精品综合在线视频| 91丨porny丨国产入口| 欧美日韩精品一区二区三区| 精品国精品国产| 国产精品国产三级国产三级人妇| 亚洲精品ww久久久久久p站| 同产精品九九九| 国产乱码精品一品二品| 日本乱人伦一区| 日韩欧美黄色影院| 亚洲色图在线看| 日韩精品电影在线| 成人在线综合网| 欧美理论片在线| 国产欧美日韩久久| 偷拍与自拍一区| 国产福利一区二区| 欧美日韩一二三区| 欧美国产综合色视频| 偷拍自拍另类欧美| 不卡一区在线观看| 欧美一区二区精品久久911| 中文子幕无线码一区tr| 婷婷夜色潮精品综合在线| 国产成人在线看| 欧美丝袜丝nylons| 国产欧美精品一区二区色综合 | 亚洲自拍偷拍欧美| 激情综合五月婷婷| 欧美亚洲一区二区在线| 国产视频一区不卡| 日韩国产欧美一区二区三区| 国产精品88888| 日韩一区二区三区精品视频| 亚洲欧美一区二区三区极速播放| 精品一区二区日韩| 欧美日本在线视频| 久久99精品国产.久久久久| 91日韩在线专区| 久久日韩精品一区二区五区| 亚洲成人动漫在线免费观看| 不卡一区二区在线| 国产人妖乱国产精品人妖| 蜜臀av性久久久久蜜臀aⅴ四虎 | 91麻豆蜜桃一区二区三区| 久久综合色婷婷| 日韩在线一区二区| 日本精品视频一区二区| 中文字幕乱码亚洲精品一区| 国产一区二区三区不卡在线观看| 欧美日韩激情一区| 亚洲狠狠丁香婷婷综合久久久| 国产成人av资源| 精品黑人一区二区三区久久| 日韩和欧美的一区| 成人91在线观看| 一片黄亚洲嫩模| 成人理论电影网| 国产自产2019最新不卡| 欧美电影一区二区| 亚洲国产精品久久久久秋霞影院| 日本丶国产丶欧美色综合| 国产精品看片你懂得| 岛国一区二区在线观看| 久久久久久毛片| 国内精品国产三级国产a久久| 精品日韩成人av| 国产真实乱对白精彩久久| 精品国产人成亚洲区| 久久精品国产成人一区二区三区| 日韩欧美亚洲国产精品字幕久久久 | 国产精品色呦呦| 成人免费毛片app| 国产精品欧美综合在线| 成人动漫一区二区| 国产精品成人在线观看| www.日韩大片| 亚洲精品视频在线观看免费| 在线观看一区二区精品视频| 亚洲成人黄色小说| 欧美一区二区在线免费播放| 日韩福利电影在线| 精品日韩成人av| 国产不卡视频一区| 亚洲欧洲精品一区二区三区| 色哟哟一区二区三区| 亚洲成a人片在线观看中文| 在线91免费看| 美国av一区二区| 国产日产欧美一区二区视频| 99riav久久精品riav| 一区2区3区在线看| 欧美一区二区视频在线观看2020 | 日韩欧美专区在线| 国产二区国产一区在线观看| 日韩美女啊v在线免费观看| 欧美色大人视频| 精彩视频一区二区三区| 国产精品午夜电影| 欧美性高清videossexo| 老色鬼精品视频在线观看播放| 国产三级一区二区| 一本色道久久加勒比精品| 日韩电影在线一区| 久久综合久久综合久久| 99精品视频在线播放观看| 图片区小说区区亚洲影院| 国产午夜精品理论片a级大结局 | 日本道免费精品一区二区三区| 日韩高清一区二区| 久久麻豆一区二区| 在线观看亚洲一区| 美女mm1313爽爽久久久蜜臀| 亚洲国产激情av| 欧美性猛交xxxxxxxx| 国产剧情一区二区三区| 夜夜嗨av一区二区三区| 亚洲精品一区二区三区香蕉 | 国产精品美女久久福利网站| 欧美日韩另类一区| 国产a精品视频| 亚洲国产精品久久久男人的天堂| 久久精品一区二区三区av| 91久久精品一区二区三| 国产精品综合在线视频| 亚洲成av人片一区二区| 亚洲国产精品二十页| 欧美日韩和欧美的一区二区| 成人一区二区三区| 丝袜美腿高跟呻吟高潮一区| 国产精品久久久久影院老司| 欧美mv和日韩mv的网站| 欧洲精品视频在线观看| 国产精品一卡二卡| 青青草国产成人99久久| 亚洲黄色在线视频| 国产亚洲欧美在线| 91麻豆精品国产91久久久久| 成人激情黄色小说| 久久成人久久鬼色| 午夜精品影院在线观看| **性色生活片久久毛片| 久久久综合激的五月天| 在线播放欧美女士性生活| 色综合中文字幕| 风间由美一区二区三区在线观看| 日本在线不卡视频| 亚洲一区在线看| 亚洲欧洲制服丝袜| 国产精品久久三区| 国产视频一区二区三区在线观看| 日韩丝袜美女视频| 91精品国产综合久久香蕉麻豆| 欧美综合天天夜夜久久| 99r国产精品| 99视频热这里只有精品免费| 国产成人综合视频| 国产一区亚洲一区| 久久www免费人成看片高清| 男女视频一区二区| 日韩av网站免费在线| 亚洲成人黄色小说| 午夜精品久久久久久久99水蜜桃| 亚洲综合精品久久| 亚洲一区在线看| 婷婷久久综合九色综合绿巨人|