社本@元ネオニート Blog

社本@元ネオニート (元々ワック) のいたずら書き (for Programmers)

AILight Banner
AILight Blog

プロフィール

社本@元ネオニート Blog
働いたら負けかなと思っていたのですが。。とうとう働き始めました。アメリカのシアトル・エリアにある企業向けのバックアップソフトを開発している会社です。日本人は私だけ。なんとか。。やっていけてるようです。

目次

Blog 利用状況

記事分類

過去の記事

タグ

再起動マネージャー (Restart Manager) API のクラス - Windows Vista

先日、APIを動的に呼び出すラッパ関数を公開しましたが、
今回はちゃんとまとめあげたクラスを公開します。

---
template <bool t_bManaged>
class CRmSessionT
{
public:
 CRmSessionT()
 {
  m_dwSessionHandle = RM_INVALID_TS_SESSION;
 }
 CRmSessionT(DWORD dwSessionHandle)
 {
  m_dwSessionHandle = dwSessionHandle;
 }
 virtual ~CRmSessionT()
 {
  if (t_bManaged && m_dwSessionHandle != RM_INVALID_TS_SESSION)
  {
   DWORD dwResult = this->EndSession();
   if (dwResult != ERROR_SUCCESS)
   {
    // 無視する。。
   }
  }
 }

public:
 bool IsValid()
 {
  if (m_dwSessionHandle == RM_INVALID_TS_SESSION)
  {
   return false;
  }
  return true;
 }

public:
 void Attach(DWORD dwSessionHandle)
 {
  ATLASSERT(m_dwSessionHandle == RM_INVALID_TS_SESSION);
  ATLASSERT(dwSessionHandle != RM_INVALID_TS_SESSION);
  m_dwSessionHandle = dwSessionHandle;
 }
 DWORD Detach()
 {    
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  DWORD dwSessionHandle = m_dwSessionHandle;
  m_dwSessionHandle = RM_INVALID_TS_SESSION;
  return dwSessionHandle;
 }

public:
 CRmSessionT& operator =(DWORD dwSessionHandle)
 {
  m_dwSessionHandle = dwSessionHandle;
  return *this;
 }
 operator DWORD()
 { 
  return m_dwSessionHandle; 
 }

public:
 DWORD StartSession(DWORD dwSessionFlags, WCHAR strSessionKey[CCH_RM_SESSION_KEY+1])
 {
  ATLASSERT(m_dwSessionHandle == RM_INVALID_TS_SESSION);
  return ::RmStartSession(&m_dwSessionHandle, dwSessionFlags, strSessionKey);
 }
 DWORD EndSession()
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  DWORD dwResult = ::RmEndSession(m_dwSessionHandle);
  m_dwSessionHandle = RM_INVALID_TS_SESSION;
  return dwResult;
 }
 DWORD AddFilter(LPCWSTR strFilename, RM_UNIQUE_PROCESS* Application, LPCWSTR strShortServiceName, RM_FILTER_ACTION ActionType)
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmAddFilter(m_dwSessionHandle, strFilename, Application, strShortServiceName, ActionType);
 }
 DWORD JoinSession(const WCHAR strSessionKey[CCH_RM_SESSION_KEY+1])
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmJoinSession(m_dwSessionHandle, strSessionKey);
 }
 DWORD GetList(UINT* pnProcInfoNeeded, UINT* pnProcInfo, RM_PROCESS_INFO rgAffectedApps[ ], LPDWORD lpdwRebootReasons)
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmGetList(m_dwSessionHandle, pnProcInfoNeeded, pnProcInfo, rgAffectedApps, lpdwRebootReasons);
 }
 DWORD GetFilterList(PBYTE pbFilterBuf, DWORD cbFilterBuf, LPDWORD cbFilterBufNeeded)
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmGetFilterList(m_dwSessionHandle, pbFilterBuf, cbFilterBuf, cbFilterBufNeeded);
 }
 DWORD CancelCurrentTask()
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmCancelCurrentTask(m_dwSessionHandle);
 }
 DWORD RemoveFilter(LPCWSTR strFilename, RM_UNIQUE_PROCESS* Application, LPCWSTR strShortServiceName)
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmRemoveFilter(m_dwSessionHandle, strFilename, Application, strShortServiceName);
 }
 DWORD RegisterResources(UINT nFiles, LPCWSTR rgsFilenames[], UINT nApplications, RM_UNIQUE_PROCESS rgApplications[], UINT nServices, LPCWSTR rgsServiceNames[])
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmRegisterResources(m_dwSessionHandle, nFiles, rgsFilenames, nApplications, rgApplications, nServices, rgsServiceNames);
 }
 DWORD Restart(DWORD dwRestartFlags, RM_WRITE_STATUS_CALLBACK fnStatus)
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmRestart(m_dwSessionHandle, dwRestartFlags, fnStatus);
 }
 DWORD Shutdown(ULONG lActionFlags, RM_WRITE_STATUS_CALLBACK fnStatus)
 {
  ATLASSERT(m_dwSessionHandle != RM_INVALID_TS_SESSION);
  return ::RmShutdown(m_dwSessionHandle, lActionFlags, fnStatus);
 }

protected:
 DWORD m_dwSessionHandle;
};

typedef CRmSessionT<false>      CRmSessionHandle;
typedef CRmSessionT<true>      CRmSession;
---


■再起動マネージャー (Restart Manager) API のラッパ関数 - Windows Vista - 社本@ワック Blog
http://www.ailight.jp/blog/sha256/archive/2007/02/16/13587.aspx

投稿日時 : 2007年2月22日 11:03


コメントを追加

タイトル
名前
URL
コメント