OSDN Git Service

Fix bugs of process protection on Windows 7.
[ffftp/ffftp.git] / mbswrapper.c
index 74a63d9..d65022e 100644 (file)
@@ -6,9 +6,6 @@
 
 #define UNICODE
 #define _UNICODE
-#define _WIN32_WINNT 0x0600
-#undef _WIN32_IE
-#define _WIN32_IE 0x0400
 
 #include <tchar.h>
 #include <direct.h>
@@ -262,6 +259,7 @@ char* AllocateStringA(int size)
 }
 
 // メモリを確保してマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
 wchar_t* DuplicateMtoW(LPCSTR lpString, int c)
 {
        wchar_t* p;
@@ -280,6 +278,7 @@ wchar_t* DuplicateMtoW(LPCSTR lpString, int c)
 }
 
 // 指定したサイズのメモリを確保してマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
 wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size)
 {
        wchar_t* p;
@@ -298,6 +297,7 @@ wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size)
 }
 
 // メモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
 wchar_t* DuplicateMtoWMultiString(LPCSTR lpString)
 {
        int count;
@@ -312,6 +312,7 @@ wchar_t* DuplicateMtoWMultiString(LPCSTR lpString)
 }
 
 // 指定したサイズのメモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
 wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size)
 {
        int count;
@@ -330,6 +331,7 @@ wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size)
 }
 
 // メモリを確保してワイド文字列からマルチバイト文字列へ変換
+// リソースIDならば元の値を返す
 char* DuplicateWtoM(LPCWSTR lpString, int c)
 {
        char* p;
@@ -348,6 +350,7 @@ char* DuplicateWtoM(LPCWSTR lpString, int c)
 }
 
 // メモリを確保してShift_JIS文字列からワイド文字列へ変換
+// リソースIDならば元の値を返す
 wchar_t* DuplicateAtoW(LPCSTR lpString, int c)
 {
        wchar_t* p;
@@ -366,6 +369,7 @@ wchar_t* DuplicateAtoW(LPCSTR lpString, int c)
 }
 
 // メモリを確保してワイド文字列からShift_JIS文字列へ変換
+// リソースIDならば元の値を返す
 char* DuplicateWtoA(LPCWSTR lpString, int c)
 {
        char* p;
@@ -384,6 +388,7 @@ char* DuplicateWtoA(LPCWSTR lpString, int c)
 }
 
 // 文字列用に確保したメモリを開放
+// リソースIDならば何もしない
 void FreeDuplicatedString(void* p)
 {
        if(p < (void*)0x00010000 || p == (void*)~0)
@@ -984,18 +989,6 @@ END_ROUTINE
        return r;
 }
 
-BOOL SetDllDirectoryM(LPCSTR lpPathName)
-{
-       BOOL r = FALSE;
-       wchar_t* pw0 = NULL;
-START_ROUTINE
-       pw0 = DuplicateMtoW(lpPathName, -1);
-       r = SetDllDirectoryW(pw0);
-END_ROUTINE
-       FreeDuplicatedString(pw0);
-       return r;
-}
-
 DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer)
 {
        DWORD r = 0;
@@ -1184,56 +1177,79 @@ START_ROUTINE
                a0.hIcon = v0->hIcon;
        a0.pszCaption = DuplicateMtoW(v0->pszCaption, -1);
        a0.nPages = v0->nPages;
-       a0.pStartPage = DuplicateMtoW(v0->pStartPage, -1);
-       if(v0->ppsp && (pwPage = (PROPSHEETPAGEW*)malloc(sizeof(PROPSHEETPAGEW) * v0->nPages)))
+       if(v0->dwFlags & PSH_USEPSTARTPAGE)
+               a0.pStartPage = DuplicateMtoW(v0->pStartPage, -1);
+       else
+               a0.nStartPage = v0->nStartPage;
+       if(v0->dwFlags & PSH_PROPSHEETPAGE)
        {
-               for(i = 0; i < v0->nPages; i++)
+               if(v0->ppsp && (pwPage = (PROPSHEETPAGEW*)malloc(sizeof(PROPSHEETPAGEW) * v0->nPages)))
                {
-                       pwPage[i].dwSize = sizeof(PROPSHEETPAGEW);
-                       pwPage[i].dwFlags = v0->ppsp[i].dwFlags;
-                       pwPage[i].hInstance = v0->ppsp[i].hInstance;
-                       pwPage[i].pszTemplate = DuplicateMtoW(v0->ppsp[i].pszTemplate, -1);
-                       if(v0->ppsp[i].dwFlags & PSP_USEICONID)
-                               pwPage[i].pszIcon = DuplicateMtoW(v0->ppsp[i].pszIcon, -1);
-                       else
-                               pwPage[i].hIcon = v0->ppsp[i].hIcon;
-                       if(v0->ppsp[i].dwFlags & PSP_USETITLE)
-                               pwPage[i].pszTitle = DuplicateMtoW(v0->ppsp[i].pszTitle, -1);
-                       pwPage[i].pfnDlgProc = v0->ppsp[i].pfnDlgProc;
-                       pwPage[i].lParam = v0->ppsp[i].lParam;
-                       // TODO: pfnCallback
-                       pwPage[i].pfnCallback = (LPFNPSPCALLBACKW)v0->ppsp[i].pfnCallback;
-                       pwPage[i].pcRefParent = v0->ppsp[i].pcRefParent;
-//                     pwPage[i].pszHeaderTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderTitle, -1);
-//                     pwPage[i].pszHeaderSubTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderSubTitle, -1);
-                       pwPage[i].hActCtx = v0->ppsp[i].hActCtx;
-//                     pwPage[i].pszbmHeader = DuplicateMtoW(v0->ppsp[i].pszbmHeader, -1);
+                       for(i = 0; i < v0->nPages; i++)
+                       {
+                               pwPage[i].dwSize = sizeof(PROPSHEETPAGEW);
+                               pwPage[i].dwFlags = v0->ppsp[i].dwFlags;
+                               pwPage[i].hInstance = v0->ppsp[i].hInstance;
+                               if(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT)
+                                       pwPage[i].pResource = v0->ppsp[i].pResource;
+                               else
+                                       pwPage[i].pszTemplate = DuplicateMtoW(v0->ppsp[i].pszTemplate, -1);
+                               if(v0->ppsp[i].dwFlags & PSP_USEICONID)
+                                       pwPage[i].pszIcon = DuplicateMtoW(v0->ppsp[i].pszIcon, -1);
+                               else
+                                       pwPage[i].hIcon = v0->ppsp[i].hIcon;
+                               if(v0->ppsp[i].dwFlags & PSP_USETITLE)
+                                       pwPage[i].pszTitle = DuplicateMtoW(v0->ppsp[i].pszTitle, -1);
+                               pwPage[i].pfnDlgProc = v0->ppsp[i].pfnDlgProc;
+                               pwPage[i].lParam = v0->ppsp[i].lParam;
+                               // TODO: pfnCallback
+                               pwPage[i].pfnCallback = (LPFNPSPCALLBACKW)v0->ppsp[i].pfnCallback;
+                               pwPage[i].pcRefParent = v0->ppsp[i].pcRefParent;
+                               if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
+                                       pwPage[i].pszHeaderTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderTitle, -1);
+                               if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
+                                       pwPage[i].pszHeaderSubTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderSubTitle, -1);
+                       }
                }
+               else
+                       pwPage = NULL;
+               a0.ppsp = pwPage;
        }
        else
-               pwPage = NULL;
-       a0.ppsp = pwPage;
+               a0.phpage = v0->phpage;
        a0.pfnCallback = v0->pfnCallback;
+       if(v0->dwFlags & PSH_USEHBMWATERMARK)
+               a0.hbmWatermark = v0->hbmWatermark;
+       else
+               a0.pszbmWatermark = DuplicateMtoW(v0->pszbmWatermark, -1);
        r = PropertySheetW(&a0);
        if(a0.dwFlags & PSH_USEICONID)
                FreeDuplicatedString((void*)a0.pszIcon);
        FreeDuplicatedString((void*)a0.pszCaption);
-       FreeDuplicatedString((void*)a0.pStartPage);
-       if(pwPage)
+       if(v0->dwFlags & PSH_USEPSTARTPAGE)
+               FreeDuplicatedString((void*)a0.pStartPage);
+       if(v0->dwFlags & PSH_PROPSHEETPAGE)
        {
-               for(i = 0; i < v0->nPages; i++)
+               if(pwPage)
                {
-                       FreeDuplicatedString((void*)pwPage[i].pszTemplate);
-                       if(pwPage[i].dwFlags & PSP_USEICONID)
-                               FreeDuplicatedString((void*)pwPage[i].pszIcon);
-                       if(pwPage[i].dwFlags & PSP_USETITLE)
-                               FreeDuplicatedString((void*)pwPage[i].pszTitle);
-//                     FreeDuplicatedString((void*)pwPage[i].pszHeaderTitle);
-//                     FreeDuplicatedString((void*)pwPage[i].pszHeaderSubTitle);
-//                     FreeDuplicatedString((void*)pwPage[i].pszbmHeader);
+                       for(i = 0; i < v0->nPages; i++)
+                       {
+                               if(!(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT))
+                                       FreeDuplicatedString((void*)pwPage[i].pszTemplate);
+                               if(v0->ppsp[i].dwFlags & PSP_USEICONID)
+                                       FreeDuplicatedString((void*)pwPage[i].pszIcon);
+                               if(v0->ppsp[i].dwFlags & PSP_USETITLE)
+                                       FreeDuplicatedString((void*)pwPage[i].pszTitle);
+                               if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
+                                       FreeDuplicatedString((void*)pwPage[i].pszHeaderTitle);
+                               if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
+                                       FreeDuplicatedString((void*)pwPage[i].pszHeaderSubTitle);
+                       }
+                       free(pwPage);
                }
-               free(pwPage);
        }
+       if(!(v0->dwFlags & PSH_USEHBMWATERMARK))
+               FreeDuplicatedString((void*)a0.pszbmWatermark);
 END_ROUTINE
        return r;
 }
@@ -1521,7 +1537,8 @@ START_ROUTINE
        wFileOp.fFlags = lpFileOp->fFlags;
        wFileOp.fAnyOperationsAborted = lpFileOp->fAnyOperationsAborted;
        wFileOp.hNameMappings = lpFileOp->hNameMappings;
-       pw2 = DuplicateMtoW(lpFileOp->lpszProgressTitle, -1);
+       if(lpFileOp->fFlags & FOF_SIMPLEPROGRESS)
+               pw2 = DuplicateMtoW(lpFileOp->lpszProgressTitle, -1);
        r = SHFileOperationW(&wFileOp);
        lpFileOp->fAnyOperationsAborted = wFileOp.fAnyOperationsAborted;
 END_ROUTINE
@@ -1563,9 +1580,13 @@ START_ROUTINE
        wmii.hbmpChecked = lpmii->hbmpChecked;
        wmii.hbmpUnchecked = lpmii->hbmpUnchecked;
        wmii.dwItemData = lpmii->dwItemData;
-       pw0 = DuplicateMtoWBuffer(lpmii->dwTypeData, -1, lpmii->cch * 4);
-       wmii.dwTypeData = pw0;
-       wmii.cch = lpmii->cch * 4;
+       if(lpmii->fMask & MIIM_TYPE)
+       {
+               pw0 = DuplicateMtoWBuffer(lpmii->dwTypeData, -1, lpmii->cch * 4);
+               wmii.dwTypeData = pw0;
+               wmii.cch = lpmii->cch * 4;
+       }
+       wmii.hbmpItem = lpmii->hbmpItem;
        r = GetMenuItemInfoW(hmenu, item, fByPosition, &wmii);
        lpmii->fType = wmii.fType;
        lpmii->fState = wmii.fState;