EternalWindows
�Z�L�����e�B�R���e�L�X�g / UAC

Windows Vista����lj����ꂽ�l�X�ȋ@�\�̒��ŁA���Ƀ��[�U�[�̋������Ђ��‚����̂́A UAC(User Account Control)�ł͂Ȃ����Ǝv���܂��B ���̋@�\�́A�Ǘ��҂Ƃ��ă��O�I�������ꍇ�ł��A�������[�U�[�Ƃ��ăv���Z�X�����s����Ƃ������̂ł���A ���ɂ��̂悤�ȃv���Z�X�ň��ӂ̂���R�[�h�����s���ꂽ�Ƃ��Ă��A���������s���₷���Ȃ�Ƃ������_������܂��B �������A���ۂɂ��̋@�\�ɂ‚��Đ[���l���Ă����ƁA�����‚��̋^�₪�����Ă���Ǝv���܂��B ���Ƃ��΁A�������[�U�[�Ƃ��ăv���Z�X�����s�����Ȃ�΁A ���������Ǘ��҂Ƃ��ă��O�I���������Ƃɂ͂Ȃ�Ȃ��̂ł͂Ȃ��ł��傤���B �܂��A�������[�U�[�Ƃ��ăR�[�h�����s����邱�Ƃɂ��A �����‚��̃v���Z�X�ł͊֐��Ăяo���Ɏ��s���邱�Ƃ��\�z����܂����A �����������͂ǂ��Ώ����邱�ƂɂȂ�̂ł��傤���B ����́A��������UAC�̋^����������邽�߂ɁA�����N�g�[�N���Ɖ��z���ɂ‚��Đ������܂��B

���[�U�[���V�X�e���Ƀ��O�I������ꍇ�ALSA(Local Security Authority)����_�Ƀg�[�N�����쐬���邽�߂̈�A�̏������s���܂��B ���O�I�������������ꍇ�A���̃��O�I���������[�U�[��\���g�[�N���ƃ��O�I���Z�b�V�������쐬����邱�ƂɂȂ�܂����A ������UAC���L���ɂȂ��Ă���ꍇ�́A�쐬���ꂽ�g�[�N����LSA�ɂ���Ē��ׂ��邱�ƂɂȂ�܂��B �����A�g�[�N�������i���������������Ă���ꍇ�́A���̃g�[�N������Ƀt�B���^�������ꂽ�g�[�N�����쐬����A ���̃t�B���^�������ꂽ�g�[�N�������2��ڂ̃��O�I�������s����܂��B �����āA�ŏI�I�ɂ́A�t�B���^�������ꂽ�g�[�N�����V�F���Ɋ��蓖�Ă��邱�ƂɂȂ�܂��B �t�B���^�����Ƃ����̂́A���i���������Ƃ�������ƒO���[�v���g�[�N�����Ŗ����ɂ��邱�Ƃł���A �����t���g�[�N�����쐬����v�̂Ƃقړ���ł��B ���̂悤�Ȑ����t���g�[�N�����V�F���Ɋ��蓖�Ă��邱�Ƃɂ��A �V�F������N�������e�v���Z�X���������[�U�[�Ƃ��Ď��s����邱�ƂɂȂ�܂��B

�ȏ�̎����番����悤�ɁAUAC���L���ł���ꍇ�ł��Ǘ��҂Ƃ��Ẵ��O�I���͐������Ă��܂��B �b�����G�ɂȂ�̂́A�t�B���^�������ꂽ�g�[�N�����V�F���Ɋ��蓖�Ă��A ���S�ȃg�[�N��(�Ǘ��҂̃��O�I���ō쐬���ꂽ�g�[�N��)���v���Z�X����B������Ă��邩��Ȃ̂ł����A ���ۂɂ͂����‚��̊m�F���@������܂��B ���Ƃ��΁ALsaEnumerateLogonSessions���Ăяo���΁A �������[�U�[���̃��O�I���Z�b�V������2�쐬����Ă��邱�Ƃ�������܂����A ����͊��S�ȃg�[�N���ƃt�B���^�������ꂽ�g�[�N����2�‚��쐬����Ă��邩��ɑ��Ȃ�܂���B �܂��A���S�ȃg�[�N���ƃt�B���^�������ꂽ�g�[�N���݂͌��Ƀ����N���Ă���A �Е��̃g�[�N����������Е��g�[�N���̃n���h�����擾���邱�Ƃ��”\�ɂȂ��Ă��܂��B ���̂悤�ȃ����N�g�[�N�����擾���������Ɏ����܂��B

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	HANDLE             hToken;
	DWORD              dwLength;
	TOKEN_ELEVATION    tokenElevation;
	TOKEN_LINKED_TOKEN linkedToken;

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) {
		MessageBox(NULL, TEXT("�g�[�N���̃n���h���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING);
		return 0;
	}
	
	if (!GetTokenInformation(hToken, TokenLinkedToken, &linkedToken, sizeof(TOKEN_LINKED_TOKEN), &dwLength)) {
		MessageBox(NULL, TEXT("�����N�g�[�N���̃n���h���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING);
		CloseHandle(hToken);
		return 0;
	}
	
	if (!GetTokenInformation(linkedToken.LinkedToken, TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) {
		MessageBox(NULL, TEXT("���i���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING);
		CloseHandle(linkedToken.LinkedToken);
		CloseHandle(hToken);
		return 0;
	}

	if (tokenElevation.TokenIsElevated)
		MessageBox(NULL, TEXT("�����N�g�[�N���͏��i����Ă��܂��B"), TEXT("OK"), MB_OK);
	else
		MessageBox(NULL, TEXT("�����N�g�[�N���͏��i����Ă��܂���B"), TEXT("OK"), MB_OK);

	CloseHandle(linkedToken.LinkedToken);
	CloseHandle(hToken);

	return 0;
}

�����N�g�[�N�����擾����ɂ́AGetTokenInformation��TokenLinkedToken���w�肵�܂��B UAC���L���łȂ��ꍇ�͂��̂悤�ȃg�[�N���͍쐬����Ă��Ȃ����߁A�֐��͎��s���邱�ƂɂȂ�܂��B 2��ڂ�GetTokenInformation�Ɏw�肵�Ă���TokenElevation�́A�g�[�N�������i����Ă��邩���m�F���邽�߂̂��̂ŁA �����ł̓����N�g�[�N����Ώۂɂ��Ă��܂��B ���̌��ʁA�����N�g�[�N�������i���Ă���Ȃ�΁A���݃v���Z�X�Ɋ��蓖�Ă��Ă���g�[�N���̓t�B���^�������ꂽ�g�[�N���ł���A �����N�g�[�N�������i����Ă��Ȃ��Ȃ�΁A���݃v���Z�X�Ɋ��蓖�Ă��Ă���g�[�N���͊��S�ȃg�[�N���ł���ƕ�����܂��B �Ȃ��A�����N�g�[�N�������S�ȃg�[�N���ł������Ƃ��Ă��A �������ɋU�����s������A�v���Z�X���쐬�����肷�邱�Ƃ͓��R�ł��܂���B ���̂悤�ȑ�������s�����ꍇ�́AERROR_PRIVILEGE_NOT_HELD���Ԃ邱�ƂɂȂ�܂��B

�����āAUAC�ɂ����鉼�z���ɂ‚��Đ������܂��B ����́A�������̃X�g�A(�t�@�C���p�X�⃌�W�X�g���L�[)�ɑ΂��ď������݂�쐬�����s����ꍇ�A ���̃X�g�A�����ɂ��ď������݂�쐬���s���Ƃ������̂ł��B ���ɁA���z�����K�������X�g�A�������܂��B

���z�����K�������X�g�A ���_�C���N�g����鉼�z�X�g�A
%ProgramFiles% %LocalAppData%VirtualStore\Program Files
%WinDir% %LocalAppData%VirtualStore\Windows
HKLM\Software HKCU\Software\Classes\VirtualStore\Machine\Software

��L�Ɏ����X�g�A�́A�A�v���P�[�V�����̃C���X�g�[�����Ȃǂɗ��p����܂����A �������ꂽ���[�U�[�ł́A���̂悤�ȃp�X�ɑ΂��Ă̏������݂�쐬�̓A�N�Z�X�����ۂ���܂��B ����ł́A�A�v���P�[�V����������ɓ��삷�邱�Ƃ��ł��Ȃ��Ȃ��Ă��܂����߁A ����Ƃ��ăA�N�Z�X�”\�ȏꏊ(���z�X�g�A)��Ώۂɂ��܂��B ���Ƃ��΁A%ProgramFiles%�Ƀt�@�C�����쐬���悤�Ƃ���ƁA %LocalAppData%VirtualStore\Program Files�Ƀt�@�C�����쐬����邱�ƂɂȂ�܂��B �ǂݎ��A�N�Z�X�ł́A�܂�%LocalAppData%VirtualStore\Program Files���m�F���A �ړI�̃t�@�C�������݂��Ȃ��ꍇ��%ProgramFiles%���m�F���܂��B

UAC���L���ɂȂ��Ă���ꍇ�A�v���Z�X�̃g�[�N���̓f�t�H���g�ʼn��z�����L���ɂȂ��Ă��܂����A ����͎��s���ɖ������邱�Ƃ��ł��܂��B �g�[�N���ɂ͉��z����L���Ɏ����l���܂܂�Ă��邽�߁A�����ύX����΂悢���ƂɂȂ�܂��B �g�[�N���̏���ύX����ɂ́ASetTokenInformation���Ăяo���܂��B

BOOL WINAPI SetTokenInformation(
  HANDLE TokenHandle,
  TOKEN_INFORMATION_CLASS TokenInformationClass,
  LPVOID TokenInformation,
  DWORD TokenInformationLength
);

TokenHandle�́A�g�[�N���̃n���h�����w�肵�܂��B TokenInformationClass�́A�ݒ肷����̎�ނ�\��TOKEN_INFORMATION_CLASS�^�̒萔���w�肵�܂��B TokenInformation�́A�ݒ肷������i�[�����o�b�t�@���w�肵�܂��B TokenInformationLength�́ATokenInformation�Ɏw�肵���o�b�t�@�̃T�C�Y���w�肵�܂��B

���ɁASetTokenInformation���Ăяo���ĉ��z���𖳌��ɂ����������܂��B ���̌��ʁA���z�X�g�A�ւ̃��_�C���N�g���������Ȃ����߁A �t�@�C���ւ̏������݂�쐬�͎��s�ɏI��邱�ƂɂȂ�܂��B

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	HANDLE          hToken;
	HANDLE          hFile;
	DWORD           dwEnabled;
	DWORD           dwLength;
	TOKEN_ELEVATION tokenElevation;

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hToken)) {
		MessageBox(NULL, TEXT("�g�[�N���̃n���h���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING);
		return 0;
	}
	
	if (!GetTokenInformation(hToken, TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) {
		MessageBox(NULL, TEXT("���i���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING);
		CloseHandle(hToken);
		return 0;
	}
	
	if (tokenElevation.TokenIsElevated == 0) {
		dwEnabled = 0;
		if (!SetTokenInformation(hToken, TokenVirtualizationEnabled, &dwEnabled, sizeof(DWORD)))
			MessageBox(NULL, TEXT("Virtualization�̖������Ɏ��s���܂����B"), NULL, MB_ICONWARNING);
	}
	
	hFile = CreateFile(TEXT("C:\\Program Files\\sample.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE) {
		if (GetLastError() == ERROR_ACCESS_DENIED)
			MessageBox(NULL, TEXT("�A�N�Z�X�����ۂ���܂����B"), NULL, MB_ICONWARNING);
		CloseHandle(hToken);
		return 0;
	}

	MessageBox(NULL, TEXT("�t�@�C�����쐬���܂����B"), TEXT("OK"), MB_OK);

	CloseHandle(hFile);
	CloseHandle(hToken);

	return 0;
}

UAC���L���ł���ꍇ�ł��A�Ǘ��҂Ƃ��Ď��s����Ă���ꍇ�͉��z�������ɖ����ɂȂ��Ă��邽�߁A ���̏ꍇ�͖����ɂ��鏈�����s�v�ƂȂ�܂��B ����āATokenElevation��ʂ��ăg�[�N�������i����Ă��邩���m�F����K�v������܂��B ���i����Ă��Ȃ��ꍇ�́A���z�����L���ɂȂ��Ă��邽�߁A TokenVirtualizationEnabled��0�ɐݒ肷�邱�ƂŁA���z���𖳌��ɂ��邱�ƂɂȂ�܂��B ����ɂ��ACreateFile�̌Ăяo���͎��s���邱�ƂɂȂ�܂��B �t��SetTokenInformation�̌Ăяo�����ȗ������ꍇ�́A���z�X�g�A�Ƀt�@�C�����쐬����Ă��邱�Ƃ��m�F�ł��܂��B ���R�Ȃ���A�Ǘ��҂Ƃ��Ď��s�����ꍇ�́ACreateFile�Ɏw�肵���p�X�Ƀt�@�C���͍쐬����܂��B �܂��A�Ǘ��҂Ƃ��Ď��s���Ă���g�[�N���ɑ΂��āA���z����L���ɂ��邱�Ƃ͂ł��܂���B

�V�[���h�A�C�R���Ə��i

�v���Z�X�𐧌����ꂽ���[�U�[�Ŏ��s���邱�Ƃ͍D�܂����Ƃ����܂����A �ꍇ�ɂ���Ă͊Ǘ��҂Ƃ��ăR�[�h�����s���Ȃ���΂Ȃ�Ȃ����Ƃ�����܂��B ���̂悤�ȏꍇ�A����ɊǗ��҂Ƃ��Ă̓���ɓ��낤�Ƃ��ẮA���˂ɏ��i�_�C�A���O���\������Ă��܂����߁A ������J�n���邽�߂̃{�^����p�ӂ��A�����ɃV�[���h�A�C�R����\������̂���ʓI�ł��B ��������΃��[�U�[�́A���̃{�^�����������Ƃŏ��i�𑣂��_�C�A���O���\�������Ɨ����ł��܂��B �_�C�A���O���\�������d�g�݂́A�Ǘ��҂łȂ���Ύ��s�ł��Ȃ��������������v���Z�X��p�ӂ��A ������Ӑ}�I�ɏ��i�����Ď��s���邱�ƂŐ������Ă��܂��B �‚܂�A�{�^���������ꂽ�v���Z�X�����i����̂ł͂Ȃ��A �{�^���������ꂽ�v���Z�X���ʂ̃v���Z�X���N�����Ă���̂ł��B ���ɁA�R�[�h��������܂��B

#include <windows.h>
#include <commctrl.h>
#include <psapi.h>

#pragma comment (lib, "psapi.lib")

#define ID_BUTTON 100

void EnumProcessName(HWND hwndListBox);
BOOL IsTokenElevation();
BOOL EnablePrivilege(LPTSTR lpszPrivilege, BOOL bEnable);
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR      szAppName[] = TEXT("sample");
	HWND       hwnd;
	MSG        msg;
	WNDCLASSEX wc;

	wc.cbSize        = sizeof(WNDCLASSEX);
	wc.style         = 0;
	wc.lpfnWndProc   = WindowProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hinst;
	wc.hIcon         = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	wc.hCursor       = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = szAppName;
	wc.hIconSm       = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	
	if (RegisterClassEx(&wc) == 0)
		return 0;

	hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL);
	if (hwnd == NULL)
		return 0;

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	
	while (GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static HWND hwndListBox = NULL;

	switch (uMsg) {
		
	case WM_CREATE: {
		HWND hwndButton;
		
		hwndListBox = CreateWindowEx(0, TEXT("LISTBOX"), NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, 0, 0, 0, 0, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		EnumProcessName(hwndListBox);

		if (!IsTokenElevation()) {
			hwndButton = CreateWindowEx(0, TEXT("BUTTON"), TEXT("�S�Ẵv���Z�X���"), WS_CHILD | WS_VISIBLE, 30, 20, 200, 30, hwnd, (HMENU)ID_BUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
			SendMessage(hwndButton, BCM_SETSHIELD, 0, TRUE);
		}
		
		return 0;
	}

	case WM_COMMAND:
		if (LOWORD(wParam) == ID_BUTTON) {
			TCHAR szModulePath[MAX_PATH];

			GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
			ShellExecute(NULL, TEXT("runas"), szModulePath, NULL, NULL, SW_SHOWNORMAL);
			if (GetLastError() == ERROR_SUCCESS)
				PostMessage(hwnd, WM_CLOSE, 0, 0);
		}
		return 0;
	
	case WM_SIZE:
		MoveWindow(hwndListBox, 0, 70, LOWORD(lParam), HIWORD(lParam), TRUE);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		break;

	}

	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

void EnumProcessName(HWND hwndListBox)
{
	DWORD  i, dwCount;
	DWORD  dwProcessId[1024], dwSize;
	HANDLE hProcess;
	TCHAR  szImageName[MAX_PATH];
	
	EnablePrivilege(SE_DEBUG_NAME, TRUE);

	EnumProcesses(dwProcessId, sizeof(dwProcessId), &dwSize);
	dwCount = dwSize / sizeof(DWORD);

	for (i = 0; i < dwCount; i++) {
		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId[i]);
		if (hProcess != NULL) {
			dwSize = sizeof(szImageName) / sizeof(TCHAR);
			QueryFullProcessImageName(hProcess, 0, szImageName, &dwSize);
			SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)szImageName);
			CloseHandle(hProcess);
		}
	}
}

BOOL IsTokenElevation()
{
	HANDLE          hToken;
	DWORD           dwLength;
	TOKEN_ELEVATION tokenElevation;

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
		return FALSE;

	if (!GetTokenInformation(hToken, TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) {
		CloseHandle(hToken);
		return FALSE;
	}
	
	CloseHandle(hToken);

	return tokenElevation.TokenIsElevated;
}

BOOL EnablePrivilege(LPTSTR lpszPrivilege, BOOL bEnable)
{
	BOOL             bResult;
	LUID             luid;
	HANDLE           hToken;
	TOKEN_PRIVILEGES tokenPrivileges;

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
		return FALSE;
	
	if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) {
		CloseHandle(hToken);
		return FALSE;
	}

	tokenPrivileges.PrivilegeCount           = 1;
	tokenPrivileges.Privileges[0].Luid       = luid;
	tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
	
	bResult = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
	
	CloseHandle(hToken);

	return bResult && GetLastError() == ERROR_SUCCESS;
}

���̃v���O�����̓v���Z�X��񋓂��邱�Ƃ��ړI�ł����A �������ꂽ���[�U�[�Ƃ��Ď��s����Ă���ꍇ�́A�S�Ẵv���Z�X��񋓂ł��܂���B ���R��SE_DEBUG_NAME�����̗L�����Ɏ��s���邩��ł���A ����ɂ��V�X�e���v���Z�X�ɑ΂���OpenProcess�����s���邩��ł��B �����ŁA���������V�X�e���v���Z�X���񋓂������ꍇ�́A "�S�Ẵv���Z�X���"�Ƃ����{�^�����������܂��B ���̂Ƃ��́A���i���邽�߂̏������s���ׂ��ł��邽�߁A ���i���Ď��s��������EXE�̃t���p�X���K�v�ɂȂ�܂����A ����͎��v���Z�X�̂��̂Ŗ�肠��܂���B �‚܂�A�����Ɠ����A�v���P�[�V���������i���Ď��s�����A���ꂪ���������ꍇ�Ɏ������g���I��������̂ł��B ���i�����Ď��s���邱�Ƃ�CreateProcess�ł͂ł��܂��񂪁A ShellExecute�Ȃ��RunAs�Ƃ�����������w�肷�邱�Ƃʼn”\�ł��B ���̏ꍇ�͏��i�̂��߂̃_�C�A���O���\������A ���[�U�[���u���v��I�������ꍇ��ERROR_SUCCESS���Ԃ��ăv���Z�X���N�����A �u�L�����Z���v��I�������ꍇ��ERROR_CANCELLED���Ԃ�܂��B

�������ꂽ�v���Z�X���I�����A���i���ꂽ�v���Z�X�����݂�������Ƃ����̂́A�K�������ǂ��I���Ƃ͌���܂���B ���Ƃ��΁A���郌�W�X�g���L�[�ւ̏������݂��s�����߂ɏ��i���K�v�ɂȂ����Ƃ��܂��B ���̏ꍇ�́A���̏��i���ꂽ�v���Z�X�����W�X�g���ւ̃A�N�Z�X���I������I������΂悢�����ł���A �������ꂽ�v���Z�X���I������K�v�͂ǂ��ɂ�����܂���B ���i���K�v�ȏ������I�����v���Z�X���A�ˑR�Ƃ��ď��i����Ď��s����邱�Ƃ͊댯�ł���Ƃ����܂�����A ���i���ꂽ�v���Z�X�͉”\�Ȍ���f�����I�������ق����悢�ł��傤�B ���ɁA���������܂��B

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR szKey[] = TEXT("write-registry");

	if (lstrcmp(GetCommandLine(), szKey) != 0) {
		// ���W�X�g���ւ̏�������
		return 0;
	}

	// �A�v���P�[�V�����{���̃R�[�h

	return 0;
}

�v���Z�X�������Ɠ����A�v���P�[�V���������i���ċN������ۂɂ́A "write-registry"�Ƃ����p�����[�^���w�肵�A�������g�͏I�����Ȃ��悤�ɂ��܂��B �N�����ꂽ�v���Z�X�̓R�}���h���C�����m�F���A ���ꂪ"write-registry"�Ƃ���������ł���Ȃ�΁A ���W�X�g���ւ̏������݂��s���ďI�����܂��B ����ɂ��A���i���ꂽ�v���Z�X�͂킸����u�̊Ԃ������݂��Ȃ����ƂɂȂ�܂��B



�߂�