Windows/개발2015.06.16 15:16

윈도우 개발을 하다보면 Process Explorer 의 중요성을 알게 된다. 하지만 해당 프로그램을 실행 할 수 없거나

다운로드 받을 수 없는 상태에서는 현재 로드되어 있는 디바이스 드라이버의 목록을 확인 할 수 없다.


다른 좋은 툴이 있지만 CMD에서 확인 할 수 있는 방법도 존재 한다. 


명령어 : driverquery




driverquery /FO list /v

driverquery /FO list /v > list.text

Posted by 최우림 -=HaeJuK=-
Windows/API2015.06.15 18:39

Name이 지정된 MUTEX를 검사하는 방법입니다.

전역 뮤텍스는 Global\\ 을 이용하요 이름 앞에 추가합니다. 


사용법 입니다.

#include "stdafx.h"
#include 
#include 
#pragma comment(lib, "shlwapi.lib")
#define RETURN(X, Y) { X = Y; goto Exit; }

int main()
{
	while(TRUE)
	{
		system("cls");
		bool bResult = FALSE;
		const TCHAR szSecureMutex[] = {_T("뮤텍스 이름") }; 

		HANDLE hHandle = ::OpenMutex(MUTEX_ALL_ACCESS,FALSE,szSecureMutex);
		if( hHandle == NULL || hHandle == INVALID_HANDLE_VALUE)
		{
			printf("FALSE \r\n");
		}
		else
		{
			::CloseHandle( hHandle );
			hHandle = NULL;
			printf("TRUE \r\n");
		}

	}

	return TRUE;
}



Posted by 최우림 -=HaeJuK=-
Windows/API2015.06.15 18:36

간단한 마우스 이벤트 발생 코드 입니다. 


Header 파일 입니다.

void ClickMouse(int parm_x, int parm_y, char parm_left_flag)

Source 파일 입니다.

void ClickMouse(int parm_x, int parm_y, char parm_left_flag) 
{ 
	int x_pos = parm_x*65535/GetSystemMetrics(SM_CXSCREEN); 
	int y_pos = parm_y*65535/GetSystemMetrics(SM_CYSCREEN); 

	::mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x_pos, y_pos, 
		0, ::GetMessageExtraInfo()); 

	if(parm_left_flag){ 
		::mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
		::mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
	} else { 
		::mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
		::mouse_event(MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_ABSOLUTE, 
			x_pos, y_pos, 0, ::GetMessageExtraInfo()); 
	} 
} 

사용법 입니다.

int main()
{
    Sleep(1000);
	POINT MousePos;
	::GetCursorPos(&MousePos);

    // 0,0, 으로 이동 후 왼쪽 버튼을 클립합니다.
	ClickMouse(0, 0, 1); 

    // 0,0, 기존 마우스 포인트로 복귀 하여 왼쪽을 클릭 합니다.
	ClickMouse(MousePos.x, MousePos.y, 1); 
	return 0;					
}
Posted by 최우림 -=HaeJuK=-
Windows/개발2015.06.15 18:30

간단한 가상환경을 확인하는 코드 입니다. 


Header 파일 입니다.

bool GetTerminalServiceClientStatus();

Source 파일 입니다.

bool GetTerminalServiceClientStatus()
{
	bool success = FALSE;

	if(0 == ::GetSystemMetrics(SM_REMOTESESSION))
	{ 
		success = FALSE; 
	}
	else 
	{ 
		success = TRUE; 
	}
	return success;
}

사용법 입니다.

int main(int argc, CHAR* argv[])
{
	while(true)
	{
		printf("Detect Remote DeskTop %d\r\n",GetTerminalServiceClientStatus());
		Sleep(1000);
	}
	return 0;
}
Posted by 최우림 -=HaeJuK=-
Windows/개발2015.06.15 18:18

현재 로그인된 계정의 권한을 확인하는 코드 입니다. 


Header 파일 입니다.

#pragma once
#include  <lmaccess.h>

const DWORD cDwNetWLevel	 = 1 ; 
const DWORD cDwNetUserLevel  = 2 ; 

class CGetUserInfo
{
public:
	enum USER_PRIV
	{
		eUSER_PRIV_GUEST = 0,
		eUSER_PRIV_USER,
		eUSER_PRIV_ADMIN,
	};
	
public:
	static CGetUserInfo &Instance();
	USER_PRIV GetUserType();

private:
	BOOL GetUserDomainInfo(LPUSER_INFO_2& pUserInfo);

private:
	CGetUserInfo(void);
	~CGetUserInfo(void);
	CGetUserInfo& operator=(const CGetUserInfo&);


};

Source 파일 입니다.

#include "StdAfx.h"
#include "GetUserInfo.h"
#include  <lmwksta.h>
#include  <lmerr.h>
#include  <lm.h>
#pragma comment(lib, "netapi32.lib")
#define RETURN(x,y){x=y;goto Exit;}

CGetUserInfo::CGetUserInfo(void)
{
}

CGetUserInfo::~CGetUserInfo(void)
{
}

CGetUserInfo& CGetUserInfo::Instance()
{
	static CGetUserInfo _Ins;
	return _Ins;
}


CGetUserInfo::USER_PRIV CGetUserInfo::GetUserType()
{
	CGetUserInfo::USER_PRIV result = eUSER_PRIV_ADMIN; 

	LPUSER_INFO_2 pUserInfo = NULL;

	if( FALSE == GetUserDomainInfo(pUserInfo) )
	{
		RETURN(result,eUSER_PRIV_ADMIN);
	}
	if(pUserInfo->usri2_priv == USER_PRIV_GUEST)
	{
		RETURN(result,eUSER_PRIV_GUEST);
	}
	else
	if(pUserInfo->usri2_priv == USER_PRIV_USER)
	{
		RETURN(result,eUSER_PRIV_USER);
	}
	else
	if(pUserInfo->usri2_priv == USER_PRIV_ADMIN)
	{
		RETURN(result,eUSER_PRIV_ADMIN);
	}
Exit:
	return result;
}

BOOL CGetUserInfo::GetUserDomainInfo(LPUSER_INFO_2& pUserInfo)
{
	BOOL bResult = TRUE;

	LPWKSTA_USER_INFO_1 pWkstaInfo = NULL;
	NET_API_STATUS nStatus = NetWkstaUserGetInfo(NULL,	cDwNetWLevel, (LPBYTE *)&pWkstaInfo);
	if (nStatus != NERR_Success || NULL == pWkstaInfo )
	{
		RETURN(bResult, FALSE);		
	}

	nStatus = NetUserGetInfo( (LPCWSTR)pWkstaInfo->wkui1_logon_server , 
							  (LPCWSTR)pWkstaInfo->wkui1_username, 
							  cDwNetUserLevel, 
							  (LPBYTE*)&pUserInfo);
	if( NULL == pUserInfo)
	{
		RETURN(bResult, FALSE);		
	}

Exit:
	if ( pWkstaInfo != NULL )
	{
		NetApiBufferFree(pWkstaInfo);
	}
	return bResult;
}


사용법 입니다.

#include "stdafx.h"
#include <windows.h>
#include "GetUserInfo.h"

int main()
{
	CGetUserInfo::Instance().GetUserType();
	system("pause");
	return 0;
}
Posted by 최우림 -=HaeJuK=-

티스토리 툴바