#include "stdafx.h"

//
// ダイアログベースアプリケーションフレームワークと
// ユーザー実装のブリッジルーチン
//
#include "GetSIDW.h"

// アプリケーションオブジェクト
GetSIDW *appObj;

/**
 * アプリケーションオブジェクトを作成します。
 */
DialogAppliBase *createAppli()
{
	// ここでユーザーのアプリケーションオブジェクトを作成します。
	appObj = new GetSIDW();
	return appObj;
}

/**
 * ダイアログプローシジャ
 *
 */
INT_PTR CALLBACK MainDialogProc(
  HWND hwndDlg,  // ダイアログボックスのハンドル
  UINT uMsg,     // メッセージ
  WPARAM wParam, // 最初のメッセージパラメータ
  LPARAM lParam  // 2 番目のメッセージパラメータ
  )
{
	// ユーザーアプリケーションのダイアログプローシジャに丸投げします。
	return appObj->dialogProc(hwndDlg, uMsg,wParam,lParam);
}

//
// ダイアログベースアプリケーションフレームワークの実装部
//

/**
 * アプリケーションウインドウクラスのインスタンスを生成します。
 *
 * @return アプリケーションウインドウクラスのインスタンス
 */
BaseDialog *GetSIDW::createBaseDialog()
{
	return appObj;
}

/**
 * アプリケーションの開始処理を実行します。
 *
 * @param lpCmdLine コマンドライン
 * @return 予備
 */
int GetSIDW::OnAppliStart(TCHAR *lpCmdLine)
{
	// この関数をオーバーライドしてアプリ固有の初期化を行います。
	// 本アプリケーションでは特に処理なし。
	return 0;
}

/**
 * ウインドウが表示されたときの処理を実行します。<br>
 * ウインドウベースアプリとインタフェースを合わせるために用意しています。
 *
 * @return 予備
 */
int GetSIDW::OnWindowShow()
{

	// この関数をオーバーライドして、初回の表示時の処理を行います。
	// このタイミングでダイアログが存在するので、ここに処理を入れることで
	// ダイアログがある状態で起動時の初期化処理を行うことができます。

	// 本アプリケーションでは特に処理なし。
	return 0;
}

/**
 * アプリケーションの終了処理を実行します。
 *
 * @return 予備
 */
int GetSIDW::OnAppliEnd()
{
	// この関数をオーバーライドしてアプリ固有の後処理を行います。
	// 本アプリケーションでは特に処理なし。
	return 0;
}

//
// ダイアログベースアプリケーションとしての
// アプリケーション固有処理の実装部分
//

// ユーザー名保存用変数
TCHAR m_userName[MAX_PATH];
DWORD m_userNameLen;
tstring m_userNameString;

/**
 * ダイアログ初期化処理
 *
 * @return TRUE: FALSE:フォーカスを設定した
 */
INT_PTR GetSIDW::OnInitDialog()
{
	TCHAR *sid;

	// 親クラスのダイアログ初期化処理を呼ぶ。
	DialogAppliBase::OnInitDialog();

	m_userNameLen = MAX_PATH;
	GetUserName(m_userName, &m_userNameLen);
	m_userNameString = m_userName;

	sid = getSID();
	if (sid == NULL) {
		return (INT_PTR)FALSE;
	}

	info = sid;
	UpdateData(false);

	LocalFree(sid);
	return (INT_PTR)FALSE;
}

/**
 * ダイアログコントロールとオブジェクトの内容の同期を取る。
 *
 * @param toObj true:コントロール→オブジェクト false:オブジェクト→コントロール
 */
void GetSIDW::UpdateData(bool toObj)
{
	// ここにダイアログのコントロールと同期を取るメンバ変数を記述します。
	DDX_Text(toObj,IDC_EDIT1,info);
	DDX_Text(toObj,IDC_STATIC_USER, m_userNameString);
}

/**
 * SIDを取得する。<br>
 * ※取得したSIDはLocalFree APIで開放すること。
 *
 * @return NULL:SID取得に失敗 非NULL:SID取得成功
 */
TCHAR *getSID(void)
{
	PSID lpSid     = NULL;
	SID sid;
	DWORD dwSidSize = 0;
	TCHAR domainName[MAX_PATH];
	DWORD domainNameLen;
	SID_NAME_USE use;
	TCHAR userName[MAX_PATH];
	DWORD userNameLen;
	BOOL result;
	TCHAR *sidString = NULL;

	/* ユーザー名取得 */
	userNameLen = MAX_PATH * sizeof(TCHAR);
	GetUserName((LPTSTR)userName,&userNameLen);

	dwSidSize = sizeof(SID);
	domainNameLen = MAX_PATH * sizeof(TCHAR);;

	result = LookupAccountName(
		NULL,
		userName,	/* ユーザー名 */
		&sid,
		&dwSidSize,
		domainName,
		&domainNameLen,
		&use);

	if (result != 0) {
#if 0
		printf("SIDの取得に成功しました。\n");
#endif
		result = ConvertSidToStringSid(lpSid, &sidString);
		if (!result) {
			return NULL;
		} else {
			return sidString;
		}
	} else {
#if 0
		printf("SIDの取得に失敗しました。%d %d\n", GetLastError(), dwSidSize);
#endif
	}

	lpSid = (PSID)LocalAlloc(LPTR, dwSidSize);
	if (lpSid == NULL) {
#if 0
		printf("SID用メモリの取得に失敗しました。\n");
#endif
		return NULL;
	}

	domainNameLen = MAX_PATH * sizeof(TCHAR);;
	result = LookupAccountName(
		NULL,
		userName,	/* ユーザー名 */
		lpSid,
		&dwSidSize,
		domainName,
		&domainNameLen,
		&use);

	if (result) {
#if 0
		printf("SIDの取得に成功しました。\n");
#endif
		result = ConvertSidToStringSid(lpSid, &sidString);
		if (!result) {
#if 0
			printf("SIDの文字列化に失敗しました。\n",sidString);
#endif
			return NULL;
		}
	} else {
#if 0
		printf("SIDの取得に失敗しました。%d %d\n", GetLastError(), dwSidSize);
#endif
	}
	LocalFree(lpSid);

	return sidString;
}

