LsaNtStatusToWinError LSAのエラーをWindowsのエラーに変換

Cの宣言:

ULONG LsaNtStatusToWinError(IN NTSTATUS Status);

説明:

Statusで指定されたLSAのエラーコードをWindowsのエラーに変換する。

引数の意味は以下の通り。
Status 変換元のLSAのエラーコード。

戻り値は、変換結果のWindowsのエラーコードである。

Cのサンプル:

hogehogeというマシンが信頼しているドメインをLsaEnumerateTrustedDomainsで取得し、結果を表示する。(本サンプルは実行による確認を行っていない)
void DispTrustedDomain(void)
{
	NTSTATUS Status;

	LSA_HANDLE hPolicy;
	LSA_OBJECT_ATTRIBUTES Attr;
	SECURITY_QUALITY_OF_SERVICE Quality;
	LPWSTR SystemName = L"hogehoge";
	LSA_UNICODE_STRING LsaSystemName;

	LSA_ENUMERATION_HANDLE hEnum;
	PLSA_TRUST_INFORMATION pTrustInfo;
	ULONG InfoNum;
	ULONG i;
	WCHAR msg[1000];

	/* 初期設定 */
	LsaSystemName.Buffer = SystemName;
	LsaSystemName.Length = lstrlen(SystemName) * sizeof(WCHAR);
	LsaSystemName.MaximumLength = (lstrlen(SystemName) + 1) * sizeof(WCHAR);

	Attr.Length = sizeof(Attr);
	Attr.RootDirectory = NULL;
	Attr.ObjectName = NULL;
	Attr.Attributes = 0;
	Attr.SecurityDescriptor = NULL;
	Attr.SecurityQualityOfService = &Quality;

	Quality.Length = sizeof(Quality);
	Quality.ImpersonationLevel = SecurityImpersonation;
	Quality.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
	Quality.EffectiveOnly = FALSE;

	/* ポリシオブジェクトのオープン */
	LsaOpenPolicy(&LsaSystemName, &Attr, POLICY_VIEW_LOCAL_INFORMATION, &hPolicy);

	hEnum = 0;
	for(;;) {
		/* ドメインの列挙 */
		Status = LsaEnumerateTrustedDomains(
			hPolicy,
			&hEnum,
			&pTrustInfo,
			1000,
			&InfoNum);

		if(LsaNtStatusToWinError(Status) == ERROR_NO_MORE_ITEMS) break;

		/* 結果の表示 */
		for(i=0; i<InfoNum; i++) {
			lstrcpyn(msg, pTrustInfo[i].Name.Buffer, pTrustInfo[i].Name.Length / sizeof(WCHAR) + 1);
			msg[pTrustInfo[i].Name.Length / sizeof(WCHAR)] = '\0';
			wprintf(L"%s\n", msg);
		}

		LsaFreeMemory(pTrustInfo);
	}

	LsaClose(hPolicy);
}

(original text:1999/05/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。