Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

管理者としてコマンドプロンプトを開くメニュー項目を追加 #618

Merged
11 changes: 11 additions & 0 deletions sakura_core/cmd/CViewCommander_File.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "plugin/CJackManager.h"
#include "env/CSakuraEnvironment.h"
#include "debug/CRunningTimer.h"
#include "util/os.h"
#include "sakura_rc.h"


Expand Down Expand Up @@ -646,6 +647,16 @@ void CViewCommander::Command_OPEN_COMMAND_PROMPT(bool isAdmin)
pVerb = L"runas";
}

#ifndef _WIN64
/*
64bit OS で 32bit アプリから管理者権限でコマンドプロンプトを起動する場合
通常は 32bit 版のコマンドプロンプトが開かれる。

Wow64 の FileSystem Redirection を一時的にオフにすることにより 64bit 版の
コマンドプロンプトを起動する
*/
CDisableWow64FsRedirect wow64Redirect(isAdmin);
#endif
auto hInstance = ::ShellExecuteW(NULL, pVerb, szCmdExePathBuf, pszcmdExeParam, strFolder.c_str(), SW_SHOWNORMAL);
// If the function succeeds, it returns a value greater than 32.
if (hInstance <= (decltype(hInstance))32) {
Expand Down
41 changes: 41 additions & 0 deletions sakura_core/util/os.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,31 @@ BOOL CheckSystemResources( const TCHAR* pszAppName )
#endif // (WINVER < _WIN32_WINNT_WIN2K)


typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

LPFN_ISWOW64PROCESS fnIsWow64Process;

/*
https://docs.microsoft.com/en-us/windows/desktop/api/wow64apiset/nf-wow64apiset-iswow64process
*/
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
//IsWow64Process is not available on all supported versions of Windows.
//Use GetModuleHandle to get a handle to the DLL that contains the function
//and GetProcAddress to get a pointer to the function if available.

fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
if(NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
//handle error
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
}
}
return bIsWow64;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 便利クラス //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
Expand All @@ -409,4 +434,20 @@ CCurrentDirectoryBackupPoint::~CCurrentDirectoryBackupPoint()
}


CDisableWow64FsRedirect::CDisableWow64FsRedirect(BOOL isOn)
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
{
m_OldValue = NULL;
if (isOn && IsWow64()) {
m_isSuccess = Wow64DisableWow64FsRedirection(&m_OldValue);
}
else {
m_isSuccess = FALSE;
}
}

CDisableWow64FsRedirect::~CDisableWow64FsRedirect()
{
if (m_isSuccess) {
Wow64RevertWow64FsRedirection(m_OldValue);
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
}
}
20 changes: 20 additions & 0 deletions sakura_core/util/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,26 @@ BOOL IsVisualStyle(); // 自分が現在ビジュアルスタイル表示
void PreventVisualStyle( HWND hWnd ); // 指定ウィンドウでビジュアルスタイルを使わないようにする // 2006.06.23 ryoji
void MyInitCommonControls(); // コモンコントロールを初期化する // 2006.06.21 ryoji

/* Wow64 のエミュレーション上で実行しているか判定する */
BOOL IsWow64();

/* Wow64 の ファイルシステムリダイレクションを一時的に無効にして、クラス破棄時に元に戻すクラス */
class CDisableWow64FsRedirect {
public:
/*!
@brief コンストラクタで ファイルシステムリダイレクションを無効にする
@param isOn この引数が TRUE のときに無効化処理を行う
*/
CDisableWow64FsRedirect(BOOL isOn);
berryzplus marked this conversation as resolved.
Show resolved Hide resolved

berryzplus marked this conversation as resolved.
Show resolved Hide resolved
/*!
@brief ファイルシステムリダイレクションを元に戻す
*/
~CDisableWow64FsRedirect();
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
private:
BOOL m_isSuccess;
berryzplus marked this conversation as resolved.
Show resolved Hide resolved
PVOID m_OldValue;
};

//カレントディレクトリユーティリティ。
//コンストラクタでカレントディレクトリを保存し、デストラクタでカレントディレクトリを復元するモノ。
Expand Down