'공부합시다/WinAPI, MFC'에 해당되는 글 3건

  1. 2009.10.06 [MFC] 프로세스 접근 권한 얻기
  2. 2009.09.30 [MFC] 리스트 컨트롤 폰트 바꾸기
  3. 2009.07.06 [WinAPI] BMP 파일에서 특정색상을 투명하게 출력하기

[MFC] 프로세스 접근 권한 얻기

프로세스에 대한 정보를 얻어오려면 권한이 없어서 읽어오지 못하는 경우가 있다.

그럴 경우에는 아래의 함수를 추가해주면 된다.


  1. BOOL SetPrivilege(HANDLE hToken,LPCTSTR Privilege, BOOL bEnablePrivilege)   
  2. {   
  3.     TOKEN_PRIVILEGES    tp;  
  4.     LUID                        luid;  
  5.     TOKEN_PRIVILEGES    tpPrevious;  
  6.     DWORD cbPrevious    =sizeof(TOKEN_PRIVILEGES);  
  7.       
  8.     if(FALSE == LookupPrivilegeValue( NULL, Privilege, &luid ))  
  9.     {  
  10.         return FALSE;  
  11.     }  
  12.       
  13.     tp.PrivilegeCount               = 1;  
  14.     tp.Privileges[0].Luid           = luid;  
  15.     tp.Privileges[0].Attributes   = 0;  
  16.       
  17.     AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious);  
  18.       
  19.     if (GetLastError() != ERROR_SUCCESS)  
  20.     {  
  21.         return FALSE;  
  22.     }  
  23.       
  24.     tpPrevious.PrivilegeCount       = 1;  
  25.     tpPrevious.Privileges[0].Luid   = luid;  
  26.       
  27.     if(bEnablePrivilege)  
  28.     {  
  29.         tpPrevious.Privileges[0].Attributes = tpPrevious.Privileges[0].Attributes | (SE_PRIVILEGE_ENABLED);  
  30.     }  
  31.     else  
  32.     {  
  33.         tpPrevious.Privileges[0].Attributes = tpPrevious.Privileges[0].Attributes ^  
  34.             (SE_PRIVILEGE_ENABLED &  
  35.             tpPrevious.Privileges[0].Attributes);  
  36.     }  
  37.       
  38.     AdjustTokenPrivileges(hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL);  
  39.       
  40.     if (GetLastError() != ERROR_SUCCESS)  
  41.     {  
  42.         return FALSE;  
  43.     }  
  44.       
  45.     return TRUE;  
  46. }  
  47.   
  48. BOOL AdjustDebugPrivilege()  
  49. {  
  50.     HANDLE hToken;  
  51.     if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))  
  52.     {  
  53.         if (GetLastError() == ERROR_NO_TOKEN)  
  54.         {  
  55.             if (FALSE == ImpersonateSelf(SecurityImpersonation))  
  56.             {  
  57.                 return FALSE;  
  58.             }  
  59.               
  60.             if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))  
  61.             {  
  62.                 AfxMessageBox("OpenThreadToken Error");  
  63.                 return FALSE;  
  64.             }  
  65.         }  
  66.           
  67.         else  
  68.         {  
  69.             return FALSE;  
  70.         }  
  71.           
  72.     }  
  73.     SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);  
  74.     if(hToken != NULL)  
  75.     {  
  76.         CloseHandle(hToken);  
  77.     }  
  78.     return TRUE;      
  79. }  
  80.   
  81. BOOL RestorePrivilege()  
  82. {  
  83.     HANDLE hToken;  
  84.     if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))  
  85.     {  
  86.         if (GetLastError() == ERROR_NO_TOKEN)  
  87.         {  
  88.             if (FALSE == ImpersonateSelf(SecurityImpersonation))  
  89.             {  
  90.                 return FALSE;  
  91.             }  
  92.               
  93.             if(FALSE == OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken))  
  94.             {  
  95.                 AfxMessageBox("OpenThreadToken Error");  
  96.                 return FALSE;  
  97.             }  
  98.         }  
  99.           
  100.         else  
  101.         {  
  102.             return FALSE;  
  103.         }  
  104.           
  105.     }  
  106.       
  107.     SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);  
  108.     if(hToken != NULL)  
  109.     {  
  110.         CloseHandle(hToken);  
  111.     }  
  112.     return TRUE;  
  113. }  


CreateToolhelp32Snapshot() 같은 함수로 프로세스나 모듈을 열기전에,
AdjustDebugPrivilege() 함수로 권한을 획득해주고, 핸들을 닫은 후에 RestorePrivilege() 함수로 권한을 반환해 주면 된다.


2009. 9. 30. 10:13

[MFC] 리스트 컨트롤 폰트 바꾸기

MFC나 API로 다이얼로그를 만들어서 하다보면 폰트가 마음에 안들때가 많습니다.

리스트 컨트롤로 헥스뷰어를 만들다가 폰트가 너무 마음에 안들어서 폰트 바꾸는 방법을 찾아봤습니다.

아래의 함수를 이용하면 폰트를 바꿀 수 있습니다.

HFONT CreateFont(
  int nHeight,             // logical height of font
  int nWidth,              // logical average character width
  int nEscapement,         // angle of escapement
  int nOrientation,        // base-line orientation angle
  int fnWeight,            // font weight
  DWORD fdwItalic,         // italic attribute flag
  DWORD fdwUnderline,      // underline attribute flag
  DWORD fdwStrikeOut,      // strikeout attribute flag
  DWORD fdwCharSet,        // character set identifier
  DWORD fdwOutputPrecision,  // output precision
  DWORD fdwClipPrecision,  // clipping precision
  DWORD fdwQuality,        // output quality
  DWORD fdwPitchAndFamily,  // pitch and family
  LPCTSTR lpszFace         // pointer to typeface name string
);

실제 사용은 아래와 같이 하면 됩니다.

HFONT hNewFont;   
hNewFont=CreateFont( 12,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,       
                               VARIABLE_PITCH | FF_MODERN,"돋음");
m_hList.SendMessage( WM_SETFONT, (WPARAM)hNewFont, (LPARAM)TRUE);

m_hList는 리스트 컨트롤의 객체입니다.
만약 다른 컨트롤의 폰트를 바꾸고 싶다면 객체부분만 바꿔주면 됩니다.
2009. 7. 6. 12:31

[WinAPI] BMP 파일에서 특정색상을 투명하게 출력하기

BOOL TransparentBlt(
  HDC
hdcDest,                                 //그려질 영역의 DC 핸들.
  int nXOriginDest,                              //그려질영역의 x 좌표.
  int nYOriginDest,                              //그려질영역의 y 좌표.
  int nWidthDest,                               //그려질 영역의 넓이
  int hHeightDest,                              //그려질 영역의 높이
  HDC hdcSrc,                                  //그릴 소스 DC 핸들  
  int nXOriginSrc,                               //그릴 소스의 x 좌표.
  int nYOriginSrc,                               //그릴 소스의 y 좌표.
  int nWidthSrc,                                 //그릴 소스의 넓이
  int nHeightSrc,                                //그릴 소스의 높이.
  UINT crTransparent                                 //비트맵에서 제외할 색상.RGB( ?, ?, ? )
);

 

HEADER :  #include <wingdi.h>

LINK       : Msimg32.lib , Msimg32.dll

Return Values

If the function succeeds, the return value is TRUE.

If the function fails, the return value is FALSE

 

  CDC* pDC = CDC::FromHandle( lpDrawItemStruct->hDC );
  CDC MemDC;

  MemDC.CreateCompatibleDC( pDC );

  CRect rcItem( &(lpDrawItemStruct->rcItem) );

  CBitmap bmpIcon;

  bmpIcon.LoadBitmap( IDB_YAHOO_COMBO_IMAGE );

  CBitmap* pOldbmp = (CBitmap*)MemDC.SelectObject( &bmpIcon );

  ::TransparentBlt( pDC->m_hDC,
   rcItem.left, rcItem.top, 16, 16,
   MemDC.m_hDC, 0, 0, 16, 16,
   RGB( 255, 255, 255 ) );


'공부합시다 > WinAPI, MFC' 카테고리의 다른 글

[MFC] 프로세스 접근 권한 얻기  (0) 2009.10.06
[MFC] 리스트 컨트롤 폰트 바꾸기  (0) 2009.09.30