• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

FFFTPのソースコードです。


Commit MetaInfo

Revision484a8d06abde1b0de9bd794aac5a03fb629625f0 (tree)
Zeit2011-10-13 07:31:26
Autors_kawamoto <s_kawamoto@user...>
Commiters_kawamoto

Log Message

Fix line feed codes.

Ändern Zusammenfassung

Diff

--- a/FFFTP.vc90.sln
+++ b/FFFTP.vc90.sln
@@ -1,25 +1,25 @@
1-Microsoft Visual Studio Solution File, Format Version 10.00
2-# Visual Studio 2008
3-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FFFTP", "FFFTP.vc90.vcproj", "{5D9496DB-45AF-4389-8FEE-27C9A2FA207A}"
4-EndProject
5-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FFFTP_English", "FFFTP_English.vc90.vcproj", "{EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}"
6-EndProject
7-Global
8- GlobalSection(SolutionConfigurationPlatforms) = preSolution
9- Debug|Win32 = Debug|Win32
10- Release|Win32 = Release|Win32
11- EndGlobalSection
12- GlobalSection(ProjectConfigurationPlatforms) = postSolution
13- {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Win32.ActiveCfg = Debug|Win32
14- {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Win32.Build.0 = Debug|Win32
15- {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Win32.ActiveCfg = Release|Win32
16- {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Win32.Build.0 = Release|Win32
17- {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Win32.ActiveCfg = Debug|Win32
18- {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Win32.Build.0 = Debug|Win32
19- {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Win32.ActiveCfg = Release|Win32
20- {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Win32.Build.0 = Release|Win32
21- EndGlobalSection
22- GlobalSection(SolutionProperties) = preSolution
23- HideSolutionNode = FALSE
24- EndGlobalSection
25-EndGlobal
1+Microsoft Visual Studio Solution File, Format Version 10.00
2+# Visual Studio 2008
3+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FFFTP", "FFFTP.vc90.vcproj", "{5D9496DB-45AF-4389-8FEE-27C9A2FA207A}"
4+EndProject
5+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FFFTP_English", "FFFTP_English.vc90.vcproj", "{EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}"
6+EndProject
7+Global
8+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
9+ Debug|Win32 = Debug|Win32
10+ Release|Win32 = Release|Win32
11+ EndGlobalSection
12+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
13+ {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Win32.ActiveCfg = Debug|Win32
14+ {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Debug|Win32.Build.0 = Debug|Win32
15+ {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Win32.ActiveCfg = Release|Win32
16+ {5D9496DB-45AF-4389-8FEE-27C9A2FA207A}.Release|Win32.Build.0 = Release|Win32
17+ {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Win32.ActiveCfg = Debug|Win32
18+ {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Debug|Win32.Build.0 = Debug|Win32
19+ {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Win32.ActiveCfg = Release|Win32
20+ {EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}.Release|Win32.Build.0 = Release|Win32
21+ EndGlobalSection
22+ GlobalSection(SolutionProperties) = preSolution
23+ HideSolutionNode = FALSE
24+ EndGlobalSection
25+EndGlobal
--- a/FFFTP.vc90.vcproj
+++ b/FFFTP.vc90.vcproj
@@ -1,466 +1,466 @@
1-<?xml version="1.0" encoding="shift_jis"?>
2-<VisualStudioProject
3- ProjectType="Visual C++"
4- Version="9.00"
5- Name="FFFTP"
6- ProjectGUID="{5D9496DB-45AF-4389-8FEE-27C9A2FA207A}"
7- RootNamespace="FFFTP"
8- TargetFrameworkVersion="131072"
9- >
10- <Platforms>
11- <Platform
12- Name="Win32"
13- />
14- </Platforms>
15- <ToolFiles>
16- </ToolFiles>
17- <Configurations>
18- <Configuration
19- Name="Debug|Win32"
20- OutputDirectory=".\Debug"
21- IntermediateDirectory=".\Debug"
22- ConfigurationType="1"
23- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
24- UseOfMFC="0"
25- ATLMinimizesCRunTimeLibraryUsage="false"
26- >
27- <Tool
28- Name="VCPreBuildEventTool"
29- />
30- <Tool
31- Name="VCCustomBuildTool"
32- />
33- <Tool
34- Name="VCXMLDataGeneratorTool"
35- />
36- <Tool
37- Name="VCWebServiceProxyGeneratorTool"
38- />
39- <Tool
40- Name="VCMIDLTool"
41- PreprocessorDefinitions="_DEBUG"
42- MkTypLibCompatible="true"
43- SuppressStartupBanner="true"
44- TargetEnvironment="1"
45- TypeLibraryName=".\Debug\FFFTP.tlb"
46- />
47- <Tool
48- Name="VCCLCompilerTool"
49- Optimization="0"
50- AdditionalIncludeDirectories="Resource;contrib\openssl\include"
51- PreprocessorDefinitions="WIN32,_DEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS"
52- RuntimeLibrary="1"
53- PrecompiledHeaderFile=".\Debug\FFFTP.pch"
54- AssemblerListingLocation=".\Debug\"
55- ObjectFile=".\Debug\"
56- ProgramDataBaseFileName=".\Debug\"
57- WarningLevel="3"
58- SuppressStartupBanner="true"
59- DebugInformationFormat="4"
60- />
61- <Tool
62- Name="VCManagedResourceCompilerTool"
63- />
64- <Tool
65- Name="VCResourceCompilerTool"
66- PreprocessorDefinitions="_DEBUG"
67- Culture="1041"
68- />
69- <Tool
70- Name="VCPreLinkEventTool"
71- />
72- <Tool
73- Name="VCLinkerTool"
74- AdditionalOptions="/MACHINE:I386"
75- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
76- OutputFile=".\Debug\FFFTP.exe"
77- LinkIncremental="2"
78- SuppressStartupBanner="true"
79- GenerateManifest="false"
80- DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;imagehlp.dll;ole32.dll;sfc.dll;shell32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
81- GenerateDebugInformation="true"
82- ProgramDatabaseFile=".\Debug\FFFTP.pdb"
83- SubSystem="2"
84- RandomizedBaseAddress="1"
85- DataExecutionPrevention="0"
86- />
87- <Tool
88- Name="VCALinkTool"
89- />
90- <Tool
91- Name="VCManifestTool"
92- />
93- <Tool
94- Name="VCXDCMakeTool"
95- />
96- <Tool
97- Name="VCBscMakeTool"
98- />
99- <Tool
100- Name="VCFxCopTool"
101- />
102- <Tool
103- Name="VCAppVerifierTool"
104- />
105- <Tool
106- Name="VCPostBuildEventTool"
107- />
108- </Configuration>
109- <Configuration
110- Name="Release|Win32"
111- OutputDirectory=".\Release"
112- IntermediateDirectory=".\Release"
113- ConfigurationType="1"
114- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
115- UseOfMFC="0"
116- ATLMinimizesCRunTimeLibraryUsage="false"
117- >
118- <Tool
119- Name="VCPreBuildEventTool"
120- />
121- <Tool
122- Name="VCCustomBuildTool"
123- />
124- <Tool
125- Name="VCXMLDataGeneratorTool"
126- />
127- <Tool
128- Name="VCWebServiceProxyGeneratorTool"
129- />
130- <Tool
131- Name="VCMIDLTool"
132- PreprocessorDefinitions="NDEBUG"
133- MkTypLibCompatible="true"
134- SuppressStartupBanner="true"
135- TargetEnvironment="1"
136- TypeLibraryName=".\Release\FFFTP.tlb"
137- />
138- <Tool
139- Name="VCCLCompilerTool"
140- InlineFunctionExpansion="1"
141- AdditionalIncludeDirectories="Resource;contrib\openssl\include"
142- PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS"
143- StringPooling="true"
144- RuntimeLibrary="0"
145- EnableFunctionLevelLinking="true"
146- PrecompiledHeaderFile=".\Release\FFFTP.pch"
147- AssemblerListingLocation=".\Release\"
148- ObjectFile=".\Release\"
149- ProgramDataBaseFileName=".\Release\"
150- WarningLevel="3"
151- SuppressStartupBanner="true"
152- DebugInformationFormat="0"
153- />
154- <Tool
155- Name="VCManagedResourceCompilerTool"
156- />
157- <Tool
158- Name="VCResourceCompilerTool"
159- PreprocessorDefinitions="NDEBUG"
160- Culture="1041"
161- />
162- <Tool
163- Name="VCPreLinkEventTool"
164- />
165- <Tool
166- Name="VCLinkerTool"
167- AdditionalOptions="/MACHINE:I386"
168- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
169- OutputFile=".\Release\FFFTP.exe"
170- LinkIncremental="1"
171- SuppressStartupBanner="true"
172- GenerateManifest="false"
173- DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;sfc.dll;shell32.dll;ole32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
174- ProgramDatabaseFile=".\Release\FFFTP.pdb"
175- SubSystem="2"
176- RandomizedBaseAddress="1"
177- DataExecutionPrevention="0"
178- />
179- <Tool
180- Name="VCALinkTool"
181- />
182- <Tool
183- Name="VCManifestTool"
184- />
185- <Tool
186- Name="VCXDCMakeTool"
187- />
188- <Tool
189- Name="VCBscMakeTool"
190- />
191- <Tool
192- Name="VCFxCopTool"
193- />
194- <Tool
195- Name="VCAppVerifierTool"
196- />
197- <Tool
198- Name="VCPostBuildEventTool"
199- />
200- </Configuration>
201- </Configurations>
202- <References>
203- </References>
204- <Files>
205- <Filter
206- Name="Source Files"
207- Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
208- >
209- <File
210- RelativePath=".\aes_modes.c"
211- >
212- </File>
213- <File
214- RelativePath=".\aescrypt.c"
215- >
216- </File>
217- <File
218- RelativePath=".\aeskey.c"
219- >
220- </File>
221- <File
222- RelativePath=".\aestab.c"
223- >
224- </File>
225- <File
226- RelativePath=".\bookmark.c"
227- >
228- </File>
229- <File
230- RelativePath=".\cache.c"
231- >
232- </File>
233- <File
234- RelativePath=".\clipboard.c"
235- >
236- </File>
237- <File
238- RelativePath=".\codecnv.c"
239- >
240- </File>
241- <File
242- RelativePath=".\connect.c"
243- >
244- </File>
245- <File
246- RelativePath=".\diskfree.c"
247- >
248- </File>
249- <File
250- RelativePath=".\dlgsize.c"
251- >
252- </File>
253- <File
254- RelativePath=".\Resource\ffftp.rc"
255- >
256- </File>
257- <File
258- RelativePath=".\filelist.c"
259- >
260- </File>
261- <File
262- RelativePath=".\ftpproc.c"
263- >
264- </File>
265- <File
266- RelativePath=".\getput.c"
267- >
268- </File>
269- <File
270- RelativePath=".\history.c"
271- >
272- </File>
273- <File
274- RelativePath=".\hostman.c"
275- >
276- </File>
277- <File
278- RelativePath=".\local.c"
279- >
280- </File>
281- <File
282- RelativePath=".\lvtips.c"
283- >
284- </File>
285- <File
286- RelativePath=".\main.c"
287- >
288- </File>
289- <File
290- RelativePath=".\mbswrapper.c"
291- >
292- </File>
293- <File
294- RelativePath=".\md4.c"
295- >
296- </File>
297- <File
298- RelativePath=".\md5.c"
299- >
300- </File>
301- <File
302- RelativePath=".\misc.c"
303- >
304- </File>
305- <File
306- RelativePath=".\OleDragDrop.c"
307- >
308- </File>
309- <File
310- RelativePath=".\option.c"
311- >
312- </File>
313- <File
314- RelativePath=".\protectprocess.c"
315- >
316- </File>
317- <File
318- RelativePath=".\ras.c"
319- >
320- </File>
321- <File
322- RelativePath=".\regexp.c"
323- >
324- </File>
325- <File
326- RelativePath=".\registory.c"
327- >
328- </File>
329- <File
330- RelativePath=".\remote.c"
331- >
332- </File>
333- <File
334- RelativePath=".\sha.c"
335- >
336- </File>
337- <File
338- RelativePath=".\skey.c"
339- >
340- </File>
341- <File
342- RelativePath=".\socket.c"
343- >
344- </File>
345- <File
346- RelativePath=".\socketwrapper.c"
347- >
348- </File>
349- <File
350- RelativePath=".\statuswin.c"
351- >
352- </File>
353- <File
354- RelativePath=".\taskwin.c"
355- >
356- </File>
357- <File
358- RelativePath=".\tool.c"
359- >
360- </File>
361- <File
362- RelativePath=".\toolmenu.c"
363- >
364- </File>
365- <File
366- RelativePath=".\updatebell.c"
367- >
368- </File>
369- <File
370- RelativePath=".\wildcard.c"
371- >
372- </File>
373- </Filter>
374- <Filter
375- Name="Header Files"
376- Filter="h;hpp;hxx;hm;inl;fi;fd"
377- >
378- <File
379- RelativePath=".\common.h"
380- >
381- </File>
382- <File
383- RelativePath=".\mbswrapper.h"
384- >
385- </File>
386- <File
387- RelativePath=".\protectprocess.h"
388- >
389- </File>
390- <File
391- RelativePath=".\Resource\resource.h"
392- >
393- </File>
394- <File
395- RelativePath=".\socketwrapper.h"
396- >
397- </File>
398- </Filter>
399- <Filter
400- Name="Resource Files"
401- Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
402- >
403- <File
404- RelativePath=".\Resource\bitmap1.bmp"
405- >
406- </File>
407- <File
408- RelativePath=".\Resource\cursor1.cur"
409- >
410- </File>
411- <File
412- RelativePath=".\Resource\cursor2.cur"
413- >
414- </File>
415- <File
416- RelativePath=".\Resource\drag_csr.cur"
417- >
418- </File>
419- <File
420- RelativePath=".\Resource\icon1.ico"
421- >
422- </File>
423- <File
424- RelativePath=".\Resource\icon2.ico"
425- >
426- </File>
427- <File
428- RelativePath=".\Resource\list_bmp.bmp"
429- >
430- </File>
431- <File
432- RelativePath=".\Resource\main_too.bmp"
433- >
434- </File>
435- <File
436- RelativePath=".\Resource\nodrop_c.cur"
437- >
438- </File>
439- <File
440- RelativePath=".\Resource\toolbar1.bmp"
441- >
442- </File>
443- </Filter>
444- <File
445- RelativePath=".\Resource\ffftp.exe.manifest"
446- >
447- <FileConfiguration
448- Name="Debug|Win32"
449- ExcludedFromBuild="true"
450- >
451- <Tool
452- Name="VCCustomBuildTool"
453- />
454- </FileConfiguration>
455- <FileConfiguration
456- Name="Release|Win32"
457- >
458- <Tool
459- Name="VCCustomBuildTool"
460- />
461- </FileConfiguration>
462- </File>
463- </Files>
464- <Globals>
465- </Globals>
466-</VisualStudioProject>
1+<?xml version="1.0" encoding="shift_jis"?>
2+<VisualStudioProject
3+ ProjectType="Visual C++"
4+ Version="9.00"
5+ Name="FFFTP"
6+ ProjectGUID="{5D9496DB-45AF-4389-8FEE-27C9A2FA207A}"
7+ RootNamespace="FFFTP"
8+ TargetFrameworkVersion="131072"
9+ >
10+ <Platforms>
11+ <Platform
12+ Name="Win32"
13+ />
14+ </Platforms>
15+ <ToolFiles>
16+ </ToolFiles>
17+ <Configurations>
18+ <Configuration
19+ Name="Debug|Win32"
20+ OutputDirectory=".\Debug"
21+ IntermediateDirectory=".\Debug"
22+ ConfigurationType="1"
23+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
24+ UseOfMFC="0"
25+ ATLMinimizesCRunTimeLibraryUsage="false"
26+ >
27+ <Tool
28+ Name="VCPreBuildEventTool"
29+ />
30+ <Tool
31+ Name="VCCustomBuildTool"
32+ />
33+ <Tool
34+ Name="VCXMLDataGeneratorTool"
35+ />
36+ <Tool
37+ Name="VCWebServiceProxyGeneratorTool"
38+ />
39+ <Tool
40+ Name="VCMIDLTool"
41+ PreprocessorDefinitions="_DEBUG"
42+ MkTypLibCompatible="true"
43+ SuppressStartupBanner="true"
44+ TargetEnvironment="1"
45+ TypeLibraryName=".\Debug\FFFTP.tlb"
46+ />
47+ <Tool
48+ Name="VCCLCompilerTool"
49+ Optimization="0"
50+ AdditionalIncludeDirectories="Resource;contrib\openssl\include"
51+ PreprocessorDefinitions="WIN32,_DEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS"
52+ RuntimeLibrary="1"
53+ PrecompiledHeaderFile=".\Debug\FFFTP.pch"
54+ AssemblerListingLocation=".\Debug\"
55+ ObjectFile=".\Debug\"
56+ ProgramDataBaseFileName=".\Debug\"
57+ WarningLevel="3"
58+ SuppressStartupBanner="true"
59+ DebugInformationFormat="4"
60+ />
61+ <Tool
62+ Name="VCManagedResourceCompilerTool"
63+ />
64+ <Tool
65+ Name="VCResourceCompilerTool"
66+ PreprocessorDefinitions="_DEBUG"
67+ Culture="1041"
68+ />
69+ <Tool
70+ Name="VCPreLinkEventTool"
71+ />
72+ <Tool
73+ Name="VCLinkerTool"
74+ AdditionalOptions="/MACHINE:I386"
75+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
76+ OutputFile=".\Debug\FFFTP.exe"
77+ LinkIncremental="2"
78+ SuppressStartupBanner="true"
79+ GenerateManifest="false"
80+ DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;imagehlp.dll;ole32.dll;sfc.dll;shell32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
81+ GenerateDebugInformation="true"
82+ ProgramDatabaseFile=".\Debug\FFFTP.pdb"
83+ SubSystem="2"
84+ RandomizedBaseAddress="1"
85+ DataExecutionPrevention="0"
86+ />
87+ <Tool
88+ Name="VCALinkTool"
89+ />
90+ <Tool
91+ Name="VCManifestTool"
92+ />
93+ <Tool
94+ Name="VCXDCMakeTool"
95+ />
96+ <Tool
97+ Name="VCBscMakeTool"
98+ />
99+ <Tool
100+ Name="VCFxCopTool"
101+ />
102+ <Tool
103+ Name="VCAppVerifierTool"
104+ />
105+ <Tool
106+ Name="VCPostBuildEventTool"
107+ />
108+ </Configuration>
109+ <Configuration
110+ Name="Release|Win32"
111+ OutputDirectory=".\Release"
112+ IntermediateDirectory=".\Release"
113+ ConfigurationType="1"
114+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
115+ UseOfMFC="0"
116+ ATLMinimizesCRunTimeLibraryUsage="false"
117+ >
118+ <Tool
119+ Name="VCPreBuildEventTool"
120+ />
121+ <Tool
122+ Name="VCCustomBuildTool"
123+ />
124+ <Tool
125+ Name="VCXMLDataGeneratorTool"
126+ />
127+ <Tool
128+ Name="VCWebServiceProxyGeneratorTool"
129+ />
130+ <Tool
131+ Name="VCMIDLTool"
132+ PreprocessorDefinitions="NDEBUG"
133+ MkTypLibCompatible="true"
134+ SuppressStartupBanner="true"
135+ TargetEnvironment="1"
136+ TypeLibraryName=".\Release\FFFTP.tlb"
137+ />
138+ <Tool
139+ Name="VCCLCompilerTool"
140+ InlineFunctionExpansion="1"
141+ AdditionalIncludeDirectories="Resource;contrib\openssl\include"
142+ PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS"
143+ StringPooling="true"
144+ RuntimeLibrary="0"
145+ EnableFunctionLevelLinking="true"
146+ PrecompiledHeaderFile=".\Release\FFFTP.pch"
147+ AssemblerListingLocation=".\Release\"
148+ ObjectFile=".\Release\"
149+ ProgramDataBaseFileName=".\Release\"
150+ WarningLevel="3"
151+ SuppressStartupBanner="true"
152+ DebugInformationFormat="0"
153+ />
154+ <Tool
155+ Name="VCManagedResourceCompilerTool"
156+ />
157+ <Tool
158+ Name="VCResourceCompilerTool"
159+ PreprocessorDefinitions="NDEBUG"
160+ Culture="1041"
161+ />
162+ <Tool
163+ Name="VCPreLinkEventTool"
164+ />
165+ <Tool
166+ Name="VCLinkerTool"
167+ AdditionalOptions="/MACHINE:I386"
168+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
169+ OutputFile=".\Release\FFFTP.exe"
170+ LinkIncremental="1"
171+ SuppressStartupBanner="true"
172+ GenerateManifest="false"
173+ DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;sfc.dll;shell32.dll;ole32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
174+ ProgramDatabaseFile=".\Release\FFFTP.pdb"
175+ SubSystem="2"
176+ RandomizedBaseAddress="1"
177+ DataExecutionPrevention="0"
178+ />
179+ <Tool
180+ Name="VCALinkTool"
181+ />
182+ <Tool
183+ Name="VCManifestTool"
184+ />
185+ <Tool
186+ Name="VCXDCMakeTool"
187+ />
188+ <Tool
189+ Name="VCBscMakeTool"
190+ />
191+ <Tool
192+ Name="VCFxCopTool"
193+ />
194+ <Tool
195+ Name="VCAppVerifierTool"
196+ />
197+ <Tool
198+ Name="VCPostBuildEventTool"
199+ />
200+ </Configuration>
201+ </Configurations>
202+ <References>
203+ </References>
204+ <Files>
205+ <Filter
206+ Name="Source Files"
207+ Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
208+ >
209+ <File
210+ RelativePath=".\aes_modes.c"
211+ >
212+ </File>
213+ <File
214+ RelativePath=".\aescrypt.c"
215+ >
216+ </File>
217+ <File
218+ RelativePath=".\aeskey.c"
219+ >
220+ </File>
221+ <File
222+ RelativePath=".\aestab.c"
223+ >
224+ </File>
225+ <File
226+ RelativePath=".\bookmark.c"
227+ >
228+ </File>
229+ <File
230+ RelativePath=".\cache.c"
231+ >
232+ </File>
233+ <File
234+ RelativePath=".\clipboard.c"
235+ >
236+ </File>
237+ <File
238+ RelativePath=".\codecnv.c"
239+ >
240+ </File>
241+ <File
242+ RelativePath=".\connect.c"
243+ >
244+ </File>
245+ <File
246+ RelativePath=".\diskfree.c"
247+ >
248+ </File>
249+ <File
250+ RelativePath=".\dlgsize.c"
251+ >
252+ </File>
253+ <File
254+ RelativePath=".\Resource\ffftp.rc"
255+ >
256+ </File>
257+ <File
258+ RelativePath=".\filelist.c"
259+ >
260+ </File>
261+ <File
262+ RelativePath=".\ftpproc.c"
263+ >
264+ </File>
265+ <File
266+ RelativePath=".\getput.c"
267+ >
268+ </File>
269+ <File
270+ RelativePath=".\history.c"
271+ >
272+ </File>
273+ <File
274+ RelativePath=".\hostman.c"
275+ >
276+ </File>
277+ <File
278+ RelativePath=".\local.c"
279+ >
280+ </File>
281+ <File
282+ RelativePath=".\lvtips.c"
283+ >
284+ </File>
285+ <File
286+ RelativePath=".\main.c"
287+ >
288+ </File>
289+ <File
290+ RelativePath=".\mbswrapper.c"
291+ >
292+ </File>
293+ <File
294+ RelativePath=".\md4.c"
295+ >
296+ </File>
297+ <File
298+ RelativePath=".\md5.c"
299+ >
300+ </File>
301+ <File
302+ RelativePath=".\misc.c"
303+ >
304+ </File>
305+ <File
306+ RelativePath=".\OleDragDrop.c"
307+ >
308+ </File>
309+ <File
310+ RelativePath=".\option.c"
311+ >
312+ </File>
313+ <File
314+ RelativePath=".\protectprocess.c"
315+ >
316+ </File>
317+ <File
318+ RelativePath=".\ras.c"
319+ >
320+ </File>
321+ <File
322+ RelativePath=".\regexp.c"
323+ >
324+ </File>
325+ <File
326+ RelativePath=".\registory.c"
327+ >
328+ </File>
329+ <File
330+ RelativePath=".\remote.c"
331+ >
332+ </File>
333+ <File
334+ RelativePath=".\sha.c"
335+ >
336+ </File>
337+ <File
338+ RelativePath=".\skey.c"
339+ >
340+ </File>
341+ <File
342+ RelativePath=".\socket.c"
343+ >
344+ </File>
345+ <File
346+ RelativePath=".\socketwrapper.c"
347+ >
348+ </File>
349+ <File
350+ RelativePath=".\statuswin.c"
351+ >
352+ </File>
353+ <File
354+ RelativePath=".\taskwin.c"
355+ >
356+ </File>
357+ <File
358+ RelativePath=".\tool.c"
359+ >
360+ </File>
361+ <File
362+ RelativePath=".\toolmenu.c"
363+ >
364+ </File>
365+ <File
366+ RelativePath=".\updatebell.c"
367+ >
368+ </File>
369+ <File
370+ RelativePath=".\wildcard.c"
371+ >
372+ </File>
373+ </Filter>
374+ <Filter
375+ Name="Header Files"
376+ Filter="h;hpp;hxx;hm;inl;fi;fd"
377+ >
378+ <File
379+ RelativePath=".\common.h"
380+ >
381+ </File>
382+ <File
383+ RelativePath=".\mbswrapper.h"
384+ >
385+ </File>
386+ <File
387+ RelativePath=".\protectprocess.h"
388+ >
389+ </File>
390+ <File
391+ RelativePath=".\Resource\resource.h"
392+ >
393+ </File>
394+ <File
395+ RelativePath=".\socketwrapper.h"
396+ >
397+ </File>
398+ </Filter>
399+ <Filter
400+ Name="Resource Files"
401+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
402+ >
403+ <File
404+ RelativePath=".\Resource\bitmap1.bmp"
405+ >
406+ </File>
407+ <File
408+ RelativePath=".\Resource\cursor1.cur"
409+ >
410+ </File>
411+ <File
412+ RelativePath=".\Resource\cursor2.cur"
413+ >
414+ </File>
415+ <File
416+ RelativePath=".\Resource\drag_csr.cur"
417+ >
418+ </File>
419+ <File
420+ RelativePath=".\Resource\icon1.ico"
421+ >
422+ </File>
423+ <File
424+ RelativePath=".\Resource\icon2.ico"
425+ >
426+ </File>
427+ <File
428+ RelativePath=".\Resource\list_bmp.bmp"
429+ >
430+ </File>
431+ <File
432+ RelativePath=".\Resource\main_too.bmp"
433+ >
434+ </File>
435+ <File
436+ RelativePath=".\Resource\nodrop_c.cur"
437+ >
438+ </File>
439+ <File
440+ RelativePath=".\Resource\toolbar1.bmp"
441+ >
442+ </File>
443+ </Filter>
444+ <File
445+ RelativePath=".\Resource\ffftp.exe.manifest"
446+ >
447+ <FileConfiguration
448+ Name="Debug|Win32"
449+ ExcludedFromBuild="true"
450+ >
451+ <Tool
452+ Name="VCCustomBuildTool"
453+ />
454+ </FileConfiguration>
455+ <FileConfiguration
456+ Name="Release|Win32"
457+ >
458+ <Tool
459+ Name="VCCustomBuildTool"
460+ />
461+ </FileConfiguration>
462+ </File>
463+ </Files>
464+ <Globals>
465+ </Globals>
466+</VisualStudioProject>
--- a/FFFTP_English.vc90.vcproj
+++ b/FFFTP_English.vc90.vcproj
@@ -1,466 +1,466 @@
1-<?xml version="1.0" encoding="shift_jis"?>
2-<VisualStudioProject
3- ProjectType="Visual C++"
4- Version="9.00"
5- Name="FFFTP_English"
6- ProjectGUID="{EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}"
7- RootNamespace="FFFTP_English"
8- TargetFrameworkVersion="131072"
9- >
10- <Platforms>
11- <Platform
12- Name="Win32"
13- />
14- </Platforms>
15- <ToolFiles>
16- </ToolFiles>
17- <Configurations>
18- <Configuration
19- Name="Debug|Win32"
20- OutputDirectory=".\FFFTP_Eng_Debug"
21- IntermediateDirectory=".\FFFTP_Eng_Debug"
22- ConfigurationType="1"
23- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
24- UseOfMFC="0"
25- ATLMinimizesCRunTimeLibraryUsage="false"
26- >
27- <Tool
28- Name="VCPreBuildEventTool"
29- />
30- <Tool
31- Name="VCCustomBuildTool"
32- />
33- <Tool
34- Name="VCXMLDataGeneratorTool"
35- />
36- <Tool
37- Name="VCWebServiceProxyGeneratorTool"
38- />
39- <Tool
40- Name="VCMIDLTool"
41- PreprocessorDefinitions="_DEBUG"
42- MkTypLibCompatible="true"
43- SuppressStartupBanner="true"
44- TargetEnvironment="1"
45- TypeLibraryName=".\FFFTP_Eng_Debug\FFFTP_English.tlb"
46- />
47- <Tool
48- Name="VCCLCompilerTool"
49- Optimization="0"
50- AdditionalIncludeDirectories="Resource_eng;contrib\openssl\include"
51- PreprocessorDefinitions="WIN32,_DEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS,ENGLISH"
52- BasicRuntimeChecks="3"
53- RuntimeLibrary="1"
54- PrecompiledHeaderFile=".\FFFTP_Eng_Debug\FFFTP_English.pch"
55- AssemblerListingLocation=".\FFFTP_Eng_Debug\"
56- ObjectFile=".\FFFTP_Eng_Debug\"
57- ProgramDataBaseFileName=".\FFFTP_Eng_Debug\"
58- WarningLevel="3"
59- SuppressStartupBanner="true"
60- DebugInformationFormat="4"
61- />
62- <Tool
63- Name="VCManagedResourceCompilerTool"
64- />
65- <Tool
66- Name="VCResourceCompilerTool"
67- PreprocessorDefinitions="_DEBUG"
68- Culture="1033"
69- />
70- <Tool
71- Name="VCPreLinkEventTool"
72- />
73- <Tool
74- Name="VCLinkerTool"
75- AdditionalOptions="/MACHINE:I386"
76- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
77- OutputFile=".\FFFTP_Eng_Debug\FFFTP.exe"
78- LinkIncremental="2"
79- SuppressStartupBanner="true"
80- GenerateManifest="false"
81- DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;sfc.dll;shell32.dll;ole32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
82- GenerateDebugInformation="true"
83- ProgramDatabaseFile=".\FFFTP_Eng_Debug\FFFTP.pdb"
84- SubSystem="2"
85- RandomizedBaseAddress="1"
86- DataExecutionPrevention="0"
87- />
88- <Tool
89- Name="VCALinkTool"
90- />
91- <Tool
92- Name="VCManifestTool"
93- />
94- <Tool
95- Name="VCXDCMakeTool"
96- />
97- <Tool
98- Name="VCBscMakeTool"
99- />
100- <Tool
101- Name="VCFxCopTool"
102- />
103- <Tool
104- Name="VCAppVerifierTool"
105- />
106- <Tool
107- Name="VCPostBuildEventTool"
108- />
109- </Configuration>
110- <Configuration
111- Name="Release|Win32"
112- OutputDirectory=".\FFFTP_Eng_Release"
113- IntermediateDirectory=".\FFFTP_Eng_Release"
114- ConfigurationType="1"
115- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
116- UseOfMFC="0"
117- ATLMinimizesCRunTimeLibraryUsage="false"
118- >
119- <Tool
120- Name="VCPreBuildEventTool"
121- />
122- <Tool
123- Name="VCCustomBuildTool"
124- />
125- <Tool
126- Name="VCXMLDataGeneratorTool"
127- />
128- <Tool
129- Name="VCWebServiceProxyGeneratorTool"
130- />
131- <Tool
132- Name="VCMIDLTool"
133- PreprocessorDefinitions="NDEBUG"
134- MkTypLibCompatible="true"
135- SuppressStartupBanner="true"
136- TargetEnvironment="1"
137- TypeLibraryName=".\FFFTP_Eng_Release\FFFTP_English.tlb"
138- />
139- <Tool
140- Name="VCCLCompilerTool"
141- InlineFunctionExpansion="1"
142- AdditionalIncludeDirectories="Resource_eng;contrib\openssl\include"
143- PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS,ENGLISH"
144- StringPooling="true"
145- RuntimeLibrary="0"
146- EnableFunctionLevelLinking="true"
147- PrecompiledHeaderFile=".\FFFTP_Eng_Release\FFFTP_English.pch"
148- AssemblerListingLocation=".\FFFTP_Eng_Release\"
149- ObjectFile=".\FFFTP_Eng_Release\"
150- ProgramDataBaseFileName=".\FFFTP_Eng_Release\"
151- WarningLevel="3"
152- SuppressStartupBanner="true"
153- />
154- <Tool
155- Name="VCManagedResourceCompilerTool"
156- />
157- <Tool
158- Name="VCResourceCompilerTool"
159- PreprocessorDefinitions="NDEBUG"
160- Culture="1033"
161- />
162- <Tool
163- Name="VCPreLinkEventTool"
164- />
165- <Tool
166- Name="VCLinkerTool"
167- AdditionalOptions="/MACHINE:I386"
168- AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
169- OutputFile=".\FFFTP_Eng_Release\FFFTP.exe"
170- LinkIncremental="1"
171- SuppressStartupBanner="true"
172- GenerateManifest="false"
173- DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;sfc.dll;shell32.dll;ole32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
174- ProgramDatabaseFile=".\FFFTP_Eng_Release\FFFTP.pdb"
175- SubSystem="2"
176- RandomizedBaseAddress="1"
177- DataExecutionPrevention="0"
178- />
179- <Tool
180- Name="VCALinkTool"
181- />
182- <Tool
183- Name="VCManifestTool"
184- />
185- <Tool
186- Name="VCXDCMakeTool"
187- />
188- <Tool
189- Name="VCBscMakeTool"
190- />
191- <Tool
192- Name="VCFxCopTool"
193- />
194- <Tool
195- Name="VCAppVerifierTool"
196- />
197- <Tool
198- Name="VCPostBuildEventTool"
199- />
200- </Configuration>
201- </Configurations>
202- <References>
203- </References>
204- <Files>
205- <Filter
206- Name="Source Files"
207- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
208- >
209- <File
210- RelativePath=".\aes_modes.c"
211- >
212- </File>
213- <File
214- RelativePath=".\aescrypt.c"
215- >
216- </File>
217- <File
218- RelativePath=".\aeskey.c"
219- >
220- </File>
221- <File
222- RelativePath=".\aestab.c"
223- >
224- </File>
225- <File
226- RelativePath=".\bookmark.c"
227- >
228- </File>
229- <File
230- RelativePath=".\cache.c"
231- >
232- </File>
233- <File
234- RelativePath=".\clipboard.c"
235- >
236- </File>
237- <File
238- RelativePath=".\codecnv.c"
239- >
240- </File>
241- <File
242- RelativePath=".\connect.c"
243- >
244- </File>
245- <File
246- RelativePath=".\diskfree.c"
247- >
248- </File>
249- <File
250- RelativePath=".\dlgsize.c"
251- >
252- </File>
253- <File
254- RelativePath=".\Resource_eng\FFFTP-eng.rc"
255- >
256- </File>
257- <File
258- RelativePath=".\filelist.c"
259- >
260- </File>
261- <File
262- RelativePath=".\ftpproc.c"
263- >
264- </File>
265- <File
266- RelativePath=".\getput.c"
267- >
268- </File>
269- <File
270- RelativePath=".\history.c"
271- >
272- </File>
273- <File
274- RelativePath=".\hostman.c"
275- >
276- </File>
277- <File
278- RelativePath=".\local.c"
279- >
280- </File>
281- <File
282- RelativePath=".\lvtips.c"
283- >
284- </File>
285- <File
286- RelativePath=".\main.c"
287- >
288- </File>
289- <File
290- RelativePath=".\mbswrapper.c"
291- >
292- </File>
293- <File
294- RelativePath=".\md4.c"
295- >
296- </File>
297- <File
298- RelativePath=".\md5.c"
299- >
300- </File>
301- <File
302- RelativePath=".\misc.c"
303- >
304- </File>
305- <File
306- RelativePath=".\OleDragDrop.c"
307- >
308- </File>
309- <File
310- RelativePath=".\option.c"
311- >
312- </File>
313- <File
314- RelativePath=".\protectprocess.c"
315- >
316- </File>
317- <File
318- RelativePath=".\ras.c"
319- >
320- </File>
321- <File
322- RelativePath=".\regexp.c"
323- >
324- </File>
325- <File
326- RelativePath=".\registory.c"
327- >
328- </File>
329- <File
330- RelativePath=".\remote.c"
331- >
332- </File>
333- <File
334- RelativePath=".\sha.c"
335- >
336- </File>
337- <File
338- RelativePath=".\skey.c"
339- >
340- </File>
341- <File
342- RelativePath=".\socket.c"
343- >
344- </File>
345- <File
346- RelativePath=".\socketwrapper.c"
347- >
348- </File>
349- <File
350- RelativePath=".\statuswin.c"
351- >
352- </File>
353- <File
354- RelativePath=".\taskwin.c"
355- >
356- </File>
357- <File
358- RelativePath=".\tool.c"
359- >
360- </File>
361- <File
362- RelativePath=".\toolmenu.c"
363- >
364- </File>
365- <File
366- RelativePath=".\updatebell.c"
367- >
368- </File>
369- <File
370- RelativePath=".\wildcard.c"
371- >
372- </File>
373- </Filter>
374- <Filter
375- Name="Header Files"
376- Filter="h;hpp;hxx;hm;inl"
377- >
378- <File
379- RelativePath=".\common.h"
380- >
381- </File>
382- <File
383- RelativePath=".\mbswrapper.h"
384- >
385- </File>
386- <File
387- RelativePath=".\protectprocess.h"
388- >
389- </File>
390- <File
391- RelativePath=".\Resource_eng\resource.h"
392- >
393- </File>
394- <File
395- RelativePath=".\socketwrapper.h"
396- >
397- </File>
398- </Filter>
399- <Filter
400- Name="Resource Files"
401- Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
402- >
403- <File
404- RelativePath=".\Resource_eng\bitmap1.bmp"
405- >
406- </File>
407- <File
408- RelativePath=".\Resource_eng\cursor1.cur"
409- >
410- </File>
411- <File
412- RelativePath=".\Resource_eng\cursor2.cur"
413- >
414- </File>
415- <File
416- RelativePath=".\Resource_eng\drag_csr.cur"
417- >
418- </File>
419- <File
420- RelativePath=".\Resource_eng\icon1.ico"
421- >
422- </File>
423- <File
424- RelativePath=".\Resource_eng\icon2.ico"
425- >
426- </File>
427- <File
428- RelativePath=".\Resource_eng\list_bmp.bmp"
429- >
430- </File>
431- <File
432- RelativePath=".\Resource_eng\main_too.bmp"
433- >
434- </File>
435- <File
436- RelativePath=".\Resource_eng\nodrop_c.cur"
437- >
438- </File>
439- <File
440- RelativePath=".\Resource_eng\toolbar1.bmp"
441- >
442- </File>
443- </Filter>
444- <File
445- RelativePath=".\Resource_eng\ffftp.exe.manifest"
446- >
447- <FileConfiguration
448- Name="Debug|Win32"
449- ExcludedFromBuild="true"
450- >
451- <Tool
452- Name="VCCustomBuildTool"
453- />
454- </FileConfiguration>
455- <FileConfiguration
456- Name="Release|Win32"
457- >
458- <Tool
459- Name="VCCustomBuildTool"
460- />
461- </FileConfiguration>
462- </File>
463- </Files>
464- <Globals>
465- </Globals>
466-</VisualStudioProject>
1+<?xml version="1.0" encoding="shift_jis"?>
2+<VisualStudioProject
3+ ProjectType="Visual C++"
4+ Version="9.00"
5+ Name="FFFTP_English"
6+ ProjectGUID="{EE7CC1BD-92A9-46D5-8270-386BD7BEEA55}"
7+ RootNamespace="FFFTP_English"
8+ TargetFrameworkVersion="131072"
9+ >
10+ <Platforms>
11+ <Platform
12+ Name="Win32"
13+ />
14+ </Platforms>
15+ <ToolFiles>
16+ </ToolFiles>
17+ <Configurations>
18+ <Configuration
19+ Name="Debug|Win32"
20+ OutputDirectory=".\FFFTP_Eng_Debug"
21+ IntermediateDirectory=".\FFFTP_Eng_Debug"
22+ ConfigurationType="1"
23+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
24+ UseOfMFC="0"
25+ ATLMinimizesCRunTimeLibraryUsage="false"
26+ >
27+ <Tool
28+ Name="VCPreBuildEventTool"
29+ />
30+ <Tool
31+ Name="VCCustomBuildTool"
32+ />
33+ <Tool
34+ Name="VCXMLDataGeneratorTool"
35+ />
36+ <Tool
37+ Name="VCWebServiceProxyGeneratorTool"
38+ />
39+ <Tool
40+ Name="VCMIDLTool"
41+ PreprocessorDefinitions="_DEBUG"
42+ MkTypLibCompatible="true"
43+ SuppressStartupBanner="true"
44+ TargetEnvironment="1"
45+ TypeLibraryName=".\FFFTP_Eng_Debug\FFFTP_English.tlb"
46+ />
47+ <Tool
48+ Name="VCCLCompilerTool"
49+ Optimization="0"
50+ AdditionalIncludeDirectories="Resource_eng;contrib\openssl\include"
51+ PreprocessorDefinitions="WIN32,_DEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS,ENGLISH"
52+ BasicRuntimeChecks="3"
53+ RuntimeLibrary="1"
54+ PrecompiledHeaderFile=".\FFFTP_Eng_Debug\FFFTP_English.pch"
55+ AssemblerListingLocation=".\FFFTP_Eng_Debug\"
56+ ObjectFile=".\FFFTP_Eng_Debug\"
57+ ProgramDataBaseFileName=".\FFFTP_Eng_Debug\"
58+ WarningLevel="3"
59+ SuppressStartupBanner="true"
60+ DebugInformationFormat="4"
61+ />
62+ <Tool
63+ Name="VCManagedResourceCompilerTool"
64+ />
65+ <Tool
66+ Name="VCResourceCompilerTool"
67+ PreprocessorDefinitions="_DEBUG"
68+ Culture="1033"
69+ />
70+ <Tool
71+ Name="VCPreLinkEventTool"
72+ />
73+ <Tool
74+ Name="VCLinkerTool"
75+ AdditionalOptions="/MACHINE:I386"
76+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
77+ OutputFile=".\FFFTP_Eng_Debug\FFFTP.exe"
78+ LinkIncremental="2"
79+ SuppressStartupBanner="true"
80+ GenerateManifest="false"
81+ DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;sfc.dll;shell32.dll;ole32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
82+ GenerateDebugInformation="true"
83+ ProgramDatabaseFile=".\FFFTP_Eng_Debug\FFFTP.pdb"
84+ SubSystem="2"
85+ RandomizedBaseAddress="1"
86+ DataExecutionPrevention="0"
87+ />
88+ <Tool
89+ Name="VCALinkTool"
90+ />
91+ <Tool
92+ Name="VCManifestTool"
93+ />
94+ <Tool
95+ Name="VCXDCMakeTool"
96+ />
97+ <Tool
98+ Name="VCBscMakeTool"
99+ />
100+ <Tool
101+ Name="VCFxCopTool"
102+ />
103+ <Tool
104+ Name="VCAppVerifierTool"
105+ />
106+ <Tool
107+ Name="VCPostBuildEventTool"
108+ />
109+ </Configuration>
110+ <Configuration
111+ Name="Release|Win32"
112+ OutputDirectory=".\FFFTP_Eng_Release"
113+ IntermediateDirectory=".\FFFTP_Eng_Release"
114+ ConfigurationType="1"
115+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC70.vsprops"
116+ UseOfMFC="0"
117+ ATLMinimizesCRunTimeLibraryUsage="false"
118+ >
119+ <Tool
120+ Name="VCPreBuildEventTool"
121+ />
122+ <Tool
123+ Name="VCCustomBuildTool"
124+ />
125+ <Tool
126+ Name="VCXMLDataGeneratorTool"
127+ />
128+ <Tool
129+ Name="VCWebServiceProxyGeneratorTool"
130+ />
131+ <Tool
132+ Name="VCMIDLTool"
133+ PreprocessorDefinitions="NDEBUG"
134+ MkTypLibCompatible="true"
135+ SuppressStartupBanner="true"
136+ TargetEnvironment="1"
137+ TypeLibraryName=".\FFFTP_Eng_Release\FFFTP_English.tlb"
138+ />
139+ <Tool
140+ Name="VCCLCompilerTool"
141+ InlineFunctionExpansion="1"
142+ AdditionalIncludeDirectories="Resource_eng;contrib\openssl\include"
143+ PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS,WINVER=0x0500,_WIN32_WINNT=0x0500,_WIN32_IE=0x0500,_CRT_SECURE_NO_WARNINGS,ENGLISH"
144+ StringPooling="true"
145+ RuntimeLibrary="0"
146+ EnableFunctionLevelLinking="true"
147+ PrecompiledHeaderFile=".\FFFTP_Eng_Release\FFFTP_English.pch"
148+ AssemblerListingLocation=".\FFFTP_Eng_Release\"
149+ ObjectFile=".\FFFTP_Eng_Release\"
150+ ProgramDataBaseFileName=".\FFFTP_Eng_Release\"
151+ WarningLevel="3"
152+ SuppressStartupBanner="true"
153+ />
154+ <Tool
155+ Name="VCManagedResourceCompilerTool"
156+ />
157+ <Tool
158+ Name="VCResourceCompilerTool"
159+ PreprocessorDefinitions="NDEBUG"
160+ Culture="1033"
161+ />
162+ <Tool
163+ Name="VCPreLinkEventTool"
164+ />
165+ <Tool
166+ Name="VCLinkerTool"
167+ AdditionalOptions="/MACHINE:I386"
168+ AdditionalDependencies="comctl32.lib crypt32.lib htmlhelp.lib imagehlp.lib rasapi32.lib sfc.lib winmm.lib wintrust.lib wsock32.lib"
169+ OutputFile=".\FFFTP_Eng_Release\FFFTP.exe"
170+ LinkIncremental="1"
171+ SuppressStartupBanner="true"
172+ GenerateManifest="false"
173+ DelayLoadDLLs="advapi32.dll;comctl32.dll;crypt32.dll;comdlg32.dll;gdi32.dll;sfc.dll;shell32.dll;ole32.dll;user32.dll;winmm.dll;wintrust.dll;wsock32.dll"
174+ ProgramDatabaseFile=".\FFFTP_Eng_Release\FFFTP.pdb"
175+ SubSystem="2"
176+ RandomizedBaseAddress="1"
177+ DataExecutionPrevention="0"
178+ />
179+ <Tool
180+ Name="VCALinkTool"
181+ />
182+ <Tool
183+ Name="VCManifestTool"
184+ />
185+ <Tool
186+ Name="VCXDCMakeTool"
187+ />
188+ <Tool
189+ Name="VCBscMakeTool"
190+ />
191+ <Tool
192+ Name="VCFxCopTool"
193+ />
194+ <Tool
195+ Name="VCAppVerifierTool"
196+ />
197+ <Tool
198+ Name="VCPostBuildEventTool"
199+ />
200+ </Configuration>
201+ </Configurations>
202+ <References>
203+ </References>
204+ <Files>
205+ <Filter
206+ Name="Source Files"
207+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
208+ >
209+ <File
210+ RelativePath=".\aes_modes.c"
211+ >
212+ </File>
213+ <File
214+ RelativePath=".\aescrypt.c"
215+ >
216+ </File>
217+ <File
218+ RelativePath=".\aeskey.c"
219+ >
220+ </File>
221+ <File
222+ RelativePath=".\aestab.c"
223+ >
224+ </File>
225+ <File
226+ RelativePath=".\bookmark.c"
227+ >
228+ </File>
229+ <File
230+ RelativePath=".\cache.c"
231+ >
232+ </File>
233+ <File
234+ RelativePath=".\clipboard.c"
235+ >
236+ </File>
237+ <File
238+ RelativePath=".\codecnv.c"
239+ >
240+ </File>
241+ <File
242+ RelativePath=".\connect.c"
243+ >
244+ </File>
245+ <File
246+ RelativePath=".\diskfree.c"
247+ >
248+ </File>
249+ <File
250+ RelativePath=".\dlgsize.c"
251+ >
252+ </File>
253+ <File
254+ RelativePath=".\Resource_eng\FFFTP-eng.rc"
255+ >
256+ </File>
257+ <File
258+ RelativePath=".\filelist.c"
259+ >
260+ </File>
261+ <File
262+ RelativePath=".\ftpproc.c"
263+ >
264+ </File>
265+ <File
266+ RelativePath=".\getput.c"
267+ >
268+ </File>
269+ <File
270+ RelativePath=".\history.c"
271+ >
272+ </File>
273+ <File
274+ RelativePath=".\hostman.c"
275+ >
276+ </File>
277+ <File
278+ RelativePath=".\local.c"
279+ >
280+ </File>
281+ <File
282+ RelativePath=".\lvtips.c"
283+ >
284+ </File>
285+ <File
286+ RelativePath=".\main.c"
287+ >
288+ </File>
289+ <File
290+ RelativePath=".\mbswrapper.c"
291+ >
292+ </File>
293+ <File
294+ RelativePath=".\md4.c"
295+ >
296+ </File>
297+ <File
298+ RelativePath=".\md5.c"
299+ >
300+ </File>
301+ <File
302+ RelativePath=".\misc.c"
303+ >
304+ </File>
305+ <File
306+ RelativePath=".\OleDragDrop.c"
307+ >
308+ </File>
309+ <File
310+ RelativePath=".\option.c"
311+ >
312+ </File>
313+ <File
314+ RelativePath=".\protectprocess.c"
315+ >
316+ </File>
317+ <File
318+ RelativePath=".\ras.c"
319+ >
320+ </File>
321+ <File
322+ RelativePath=".\regexp.c"
323+ >
324+ </File>
325+ <File
326+ RelativePath=".\registory.c"
327+ >
328+ </File>
329+ <File
330+ RelativePath=".\remote.c"
331+ >
332+ </File>
333+ <File
334+ RelativePath=".\sha.c"
335+ >
336+ </File>
337+ <File
338+ RelativePath=".\skey.c"
339+ >
340+ </File>
341+ <File
342+ RelativePath=".\socket.c"
343+ >
344+ </File>
345+ <File
346+ RelativePath=".\socketwrapper.c"
347+ >
348+ </File>
349+ <File
350+ RelativePath=".\statuswin.c"
351+ >
352+ </File>
353+ <File
354+ RelativePath=".\taskwin.c"
355+ >
356+ </File>
357+ <File
358+ RelativePath=".\tool.c"
359+ >
360+ </File>
361+ <File
362+ RelativePath=".\toolmenu.c"
363+ >
364+ </File>
365+ <File
366+ RelativePath=".\updatebell.c"
367+ >
368+ </File>
369+ <File
370+ RelativePath=".\wildcard.c"
371+ >
372+ </File>
373+ </Filter>
374+ <Filter
375+ Name="Header Files"
376+ Filter="h;hpp;hxx;hm;inl"
377+ >
378+ <File
379+ RelativePath=".\common.h"
380+ >
381+ </File>
382+ <File
383+ RelativePath=".\mbswrapper.h"
384+ >
385+ </File>
386+ <File
387+ RelativePath=".\protectprocess.h"
388+ >
389+ </File>
390+ <File
391+ RelativePath=".\Resource_eng\resource.h"
392+ >
393+ </File>
394+ <File
395+ RelativePath=".\socketwrapper.h"
396+ >
397+ </File>
398+ </Filter>
399+ <Filter
400+ Name="Resource Files"
401+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
402+ >
403+ <File
404+ RelativePath=".\Resource_eng\bitmap1.bmp"
405+ >
406+ </File>
407+ <File
408+ RelativePath=".\Resource_eng\cursor1.cur"
409+ >
410+ </File>
411+ <File
412+ RelativePath=".\Resource_eng\cursor2.cur"
413+ >
414+ </File>
415+ <File
416+ RelativePath=".\Resource_eng\drag_csr.cur"
417+ >
418+ </File>
419+ <File
420+ RelativePath=".\Resource_eng\icon1.ico"
421+ >
422+ </File>
423+ <File
424+ RelativePath=".\Resource_eng\icon2.ico"
425+ >
426+ </File>
427+ <File
428+ RelativePath=".\Resource_eng\list_bmp.bmp"
429+ >
430+ </File>
431+ <File
432+ RelativePath=".\Resource_eng\main_too.bmp"
433+ >
434+ </File>
435+ <File
436+ RelativePath=".\Resource_eng\nodrop_c.cur"
437+ >
438+ </File>
439+ <File
440+ RelativePath=".\Resource_eng\toolbar1.bmp"
441+ >
442+ </File>
443+ </Filter>
444+ <File
445+ RelativePath=".\Resource_eng\ffftp.exe.manifest"
446+ >
447+ <FileConfiguration
448+ Name="Debug|Win32"
449+ ExcludedFromBuild="true"
450+ >
451+ <Tool
452+ Name="VCCustomBuildTool"
453+ />
454+ </FileConfiguration>
455+ <FileConfiguration
456+ Name="Release|Win32"
457+ >
458+ <Tool
459+ Name="VCCustomBuildTool"
460+ />
461+ </FileConfiguration>
462+ </File>
463+ </Files>
464+ <Globals>
465+ </Globals>
466+</VisualStudioProject>
--- a/Package/EXEpress/eng/ffftp.ini
+++ b/Package/EXEpress/eng/ffftp.ini
@@ -1,133 +1,133 @@
1-[EXEpress]
2-UseExtensionModuleFile=0
3-ExtensionModuleFile=
4-ExtensionModuleDatFile=
5-NoUI=0
6-SrcArchiveFile=ffftp.cab
7-DstExeFile=ffftp.exe
8-DialogTitle=FFFTP Ver.1.99
9-ForFreeSoftWare=0
10-EXEpressFor=EXEpress CX 5 Professional Licensed Edition
11-Greeting0=Click Next button to start install...
12-Greeting1=
13-Greeting2=
14-IconFile=
15-IconTypeIndex=1
16-UseBannerFile=1
17-NoExtractBannerFile=1
18-BannerFile=banner.bmp
19-UseURL=1
20-HPTitle=このプログラムのウェブサイトにアクセスしますか?
21-URL=http://sourceforge.jp/projects/ffftp/
22-NoSaveInstallPath=0
23-FailIfPathRegNotExist=0
24-OnlyAdmin=0
25-DenyUsers=1
26-NoCRCCheck=0
27-BootOSCheck=1
28-BootOSFlag=1008
29-BootableOSFlag=1008
30-Deny64bitMode=0
31-CheckTrust=0
32-UsePanelBitmap=0
33-NoExtractPanelBitmap=0
34-PanelBitmap=
35-UseNewWizard=0
36-UseWiz97PanelBitmap=0
37-NoExtractWiz97PanelBitmap=0
38-Wiz97PanelBitmap=
39-UseBackScreen=0
40-BackScreenText=
41-BackScreenColor=0,0,255
42-BackScreenLogoBmp=
43-UseBackScreenLogoBmp=0
44-ExtractScreenLogo=1
45-UseExplain=1
46-ExplainFile=FFFTP.txt
47-NoExtractExplainFile=0
48-ExplainToConsent=0
49-ExplainAllRead=0
50-UseSaveExplainShowFlag=0
51-SaveExplainShowFlagRootKey=1
52-SaveExplainShowFlagKey=Software\EXEpress Programs
53-SaveExplainShowFlagValue=SetupShowExplainFlag
54-AskExtPath=1
55-UseExtractFolder=1
56-BaseFolder=0
57-ExtractFolder=ffftp
58-AskOverwrite=0
59-HideAskOverWrite=0
60-AddFileTitle=0
61-WithAttribute=0
62-NoAskMakeDir=0
63-ForceUninstallDir=0
64-OverWriteMethod=0
65-NoOverwriteNewTimeStamp=0
66-NoOpenFolderOnEnd=0
67-UseSavePath=1
68-SavePathRootKey=2
69-SavePathKey=Software\Sota\FFFTP
70-SavePathValue=InstallDir
71-StartMenuToCommon=1
72-UseStartMenu=1
73-StartMenuGroup=FFFTP
74-StartMenu0_Title=FFFTP
75-StartMenu0_File=FFFTP.exe
76-StartMenu0_Args=
77-StartMenu0_Comment=
78-StartMenu0_Icon=
79-StartMenu0_CreateOnQuickLaunch=0
80-StartMenu0_CreateOnDesktop=1
81-StartMenu0_CreateOnStartup=0
82-StartMenu0_CreateOnStartRoot=0
83-StartMenu0_NoCreateInGroup=0
84-StartMenu1_Title=About FFFTP
85-StartMenu1_File=FFFTP.txt
86-StartMenu1_Args=
87-StartMenu1_Comment=
88-StartMenu1_Icon=
89-StartMenu1_CreateOnQuickLaunch=0
90-StartMenu1_CreateOnDesktop=0
91-StartMenu1_CreateOnStartup=0
92-StartMenu1_CreateOnStartRoot=0
93-StartMenu1_NoCreateInGroup=0
94-StartMenu2_Title=History
95-StartMenu2_File=history.txt
96-StartMenu2_Args=
97-StartMenu2_Comment=
98-StartMenu2_Icon=
99-StartMenu2_CreateOnQuickLaunch=0
100-StartMenu2_CreateOnDesktop=0
101-StartMenu2_CreateOnStartup=0
102-StartMenu2_CreateOnStartRoot=0
103-StartMenu2_NoCreateInGroup=0
104-UseUnInstall=1
105-UseEXEpressUninstaller=1
106-UseEXEpressUninstallerFolder=
107-UnInstallTitle=FFFTP
108-UnInstallKey=FFFTP
109-UnInstallFile=
110-UnInstallArgs=
111-UninstIconFile=
112-UninstallRebootable=1
113-AutoUninstIni=1
114-AutoDeleteDat=0
115-UnInstallPublisher=
116-UnInstallSupportLink=
117-UnInstallHelpLink=
118-UnInstallUpdateLink=
119-UninstallReg0=HKEY_CURRENT_USER\Sota\FFFTP
120-UseAutoExecute=0
121-CmdLine=
122-CmdArgs=
123-AfterDeleteFiles=0
124-InstallShield=0
125-64bitSFX=0
126-ModifyOSVersion=0
127-ModifySubSysVersion=0
128-SFXOSMajor=4
129-SFXOSMinor=0
130-SFXSubSysMajor=4
131-SFXSubSysMinor=0
132-ModifyManifest=0
133-ManifestFile=
1+[EXEpress]
2+UseExtensionModuleFile=0
3+ExtensionModuleFile=
4+ExtensionModuleDatFile=
5+NoUI=0
6+SrcArchiveFile=ffftp.cab
7+DstExeFile=ffftp.exe
8+DialogTitle=FFFTP Ver.1.99
9+ForFreeSoftWare=0
10+EXEpressFor=EXEpress CX 5 Professional Licensed Edition
11+Greeting0=Click Next button to start install...
12+Greeting1=
13+Greeting2=
14+IconFile=
15+IconTypeIndex=1
16+UseBannerFile=1
17+NoExtractBannerFile=1
18+BannerFile=banner.bmp
19+UseURL=1
20+HPTitle=このプログラムのウェブサイトにアクセスしますか?
21+URL=http://sourceforge.jp/projects/ffftp/
22+NoSaveInstallPath=0
23+FailIfPathRegNotExist=0
24+OnlyAdmin=0
25+DenyUsers=1
26+NoCRCCheck=0
27+BootOSCheck=1
28+BootOSFlag=1008
29+BootableOSFlag=1008
30+Deny64bitMode=0
31+CheckTrust=0
32+UsePanelBitmap=0
33+NoExtractPanelBitmap=0
34+PanelBitmap=
35+UseNewWizard=0
36+UseWiz97PanelBitmap=0
37+NoExtractWiz97PanelBitmap=0
38+Wiz97PanelBitmap=
39+UseBackScreen=0
40+BackScreenText=
41+BackScreenColor=0,0,255
42+BackScreenLogoBmp=
43+UseBackScreenLogoBmp=0
44+ExtractScreenLogo=1
45+UseExplain=1
46+ExplainFile=FFFTP.txt
47+NoExtractExplainFile=0
48+ExplainToConsent=0
49+ExplainAllRead=0
50+UseSaveExplainShowFlag=0
51+SaveExplainShowFlagRootKey=1
52+SaveExplainShowFlagKey=Software\EXEpress Programs
53+SaveExplainShowFlagValue=SetupShowExplainFlag
54+AskExtPath=1
55+UseExtractFolder=1
56+BaseFolder=0
57+ExtractFolder=ffftp
58+AskOverwrite=0
59+HideAskOverWrite=0
60+AddFileTitle=0
61+WithAttribute=0
62+NoAskMakeDir=0
63+ForceUninstallDir=0
64+OverWriteMethod=0
65+NoOverwriteNewTimeStamp=0
66+NoOpenFolderOnEnd=0
67+UseSavePath=1
68+SavePathRootKey=2
69+SavePathKey=Software\Sota\FFFTP
70+SavePathValue=InstallDir
71+StartMenuToCommon=1
72+UseStartMenu=1
73+StartMenuGroup=FFFTP
74+StartMenu0_Title=FFFTP
75+StartMenu0_File=FFFTP.exe
76+StartMenu0_Args=
77+StartMenu0_Comment=
78+StartMenu0_Icon=
79+StartMenu0_CreateOnQuickLaunch=0
80+StartMenu0_CreateOnDesktop=1
81+StartMenu0_CreateOnStartup=0
82+StartMenu0_CreateOnStartRoot=0
83+StartMenu0_NoCreateInGroup=0
84+StartMenu1_Title=About FFFTP
85+StartMenu1_File=FFFTP.txt
86+StartMenu1_Args=
87+StartMenu1_Comment=
88+StartMenu1_Icon=
89+StartMenu1_CreateOnQuickLaunch=0
90+StartMenu1_CreateOnDesktop=0
91+StartMenu1_CreateOnStartup=0
92+StartMenu1_CreateOnStartRoot=0
93+StartMenu1_NoCreateInGroup=0
94+StartMenu2_Title=History
95+StartMenu2_File=history.txt
96+StartMenu2_Args=
97+StartMenu2_Comment=
98+StartMenu2_Icon=
99+StartMenu2_CreateOnQuickLaunch=0
100+StartMenu2_CreateOnDesktop=0
101+StartMenu2_CreateOnStartup=0
102+StartMenu2_CreateOnStartRoot=0
103+StartMenu2_NoCreateInGroup=0
104+UseUnInstall=1
105+UseEXEpressUninstaller=1
106+UseEXEpressUninstallerFolder=
107+UnInstallTitle=FFFTP
108+UnInstallKey=FFFTP
109+UnInstallFile=
110+UnInstallArgs=
111+UninstIconFile=
112+UninstallRebootable=1
113+AutoUninstIni=1
114+AutoDeleteDat=0
115+UnInstallPublisher=
116+UnInstallSupportLink=
117+UnInstallHelpLink=
118+UnInstallUpdateLink=
119+UninstallReg0=HKEY_CURRENT_USER\Sota\FFFTP
120+UseAutoExecute=0
121+CmdLine=
122+CmdArgs=
123+AfterDeleteFiles=0
124+InstallShield=0
125+64bitSFX=0
126+ModifyOSVersion=0
127+ModifySubSysVersion=0
128+SFXOSMajor=4
129+SFXOSMinor=0
130+SFXSubSysMajor=4
131+SFXSubSysMinor=0
132+ModifyManifest=0
133+ManifestFile=
--- a/Package/EXEpress/jpn/ffftp.ini
+++ b/Package/EXEpress/jpn/ffftp.ini
@@ -1,143 +1,143 @@
1-[EXEpress]
2-UseExtensionModuleFile=0
3-ExtensionModuleFile=
4-ExtensionModuleDatFile=
5-NoUI=0
6-SrcArchiveFile=ffftp.cab
7-DstExeFile=ffftp.exe
8-DialogTitle=FFFTP Ver.1.99
9-ForFreeSoftWare=0
10-EXEpressFor=EXEpress CX 5 Professional Licensed Edition
11-Greeting0=FFFTPをインストールします。
12-Greeting1=[次へ(N)]を押してください。
13-Greeting2=
14-IconFile=
15-IconTypeIndex=1
16-UseBannerFile=1
17-NoExtractBannerFile=1
18-BannerFile=banner.bmp
19-UseURL=1
20-HPTitle=このプログラムのウェブサイトにアクセスしますか?
21-URL=http://sourceforge.jp/projects/ffftp/
22-NoSaveInstallPath=0
23-FailIfPathRegNotExist=0
24-OnlyAdmin=0
25-DenyUsers=1
26-NoCRCCheck=0
27-BootOSCheck=1
28-BootOSFlag=1008
29-BootableOSFlag=1008
30-Deny64bitMode=0
31-CheckTrust=0
32-UsePanelBitmap=0
33-NoExtractPanelBitmap=0
34-PanelBitmap=
35-UseNewWizard=0
36-UseWiz97PanelBitmap=0
37-NoExtractWiz97PanelBitmap=0
38-Wiz97PanelBitmap=
39-UseBackScreen=0
40-BackScreenText=
41-BackScreenColor=0,0,255
42-BackScreenLogoBmp=
43-UseBackScreenLogoBmp=0
44-ExtractScreenLogo=1
45-UseExplain=1
46-ExplainFile=FFFTP.txt
47-NoExtractExplainFile=0
48-ExplainToConsent=0
49-ExplainAllRead=0
50-UseSaveExplainShowFlag=0
51-SaveExplainShowFlagRootKey=1
52-SaveExplainShowFlagKey=Software\EXEpress Programs
53-SaveExplainShowFlagValue=SetupShowExplainFlag
54-AskExtPath=1
55-UseExtractFolder=1
56-BaseFolder=0
57-ExtractFolder=ffftp
58-AskOverwrite=0
59-HideAskOverWrite=0
60-AddFileTitle=0
61-WithAttribute=0
62-NoAskMakeDir=0
63-ForceUninstallDir=0
64-OverWriteMethod=0
65-NoOverwriteNewTimeStamp=0
66-NoOpenFolderOnEnd=0
67-UseSavePath=1
68-SavePathRootKey=2
69-SavePathKey=Software\Sota\FFFTP
70-SavePathValue=InstallDir
71-StartMenuToCommon=1
72-UseStartMenu=1
73-StartMenuGroup=FFFTP
74-StartMenu0_Title=FFFTP
75-StartMenu0_File=FFFTP.exe
76-StartMenu0_Args=
77-StartMenu0_Comment=
78-StartMenu0_Icon=
79-StartMenu0_CreateOnQuickLaunch=0
80-StartMenu0_CreateOnDesktop=1
81-StartMenu0_CreateOnStartup=0
82-StartMenu0_CreateOnStartRoot=0
83-StartMenu0_NoCreateInGroup=0
84-StartMenu1_Title=FFFTPについて
85-StartMenu1_File=FFFTP.txt
86-StartMenu1_Args=
87-StartMenu1_Comment=
88-StartMenu1_Icon=
89-StartMenu1_CreateOnQuickLaunch=0
90-StartMenu1_CreateOnDesktop=0
91-StartMenu1_CreateOnStartup=0
92-StartMenu1_CreateOnStartRoot=0
93-StartMenu1_NoCreateInGroup=0
94-StartMenu2_Title=FFFTPのヘルプ
95-StartMenu2_File=FFFTP.CHM
96-StartMenu2_Args=
97-StartMenu2_Comment=
98-StartMenu2_Icon=
99-StartMenu2_CreateOnQuickLaunch=0
100-StartMenu2_CreateOnDesktop=0
101-StartMenu2_CreateOnStartup=0
102-StartMenu2_CreateOnStartRoot=0
103-StartMenu2_NoCreateInGroup=0
104-StartMenu3_Title=FFFTPの改版履歴
105-StartMenu3_File=history.txt
106-StartMenu3_Args=
107-StartMenu3_Comment=
108-StartMenu3_Icon=
109-StartMenu3_CreateOnQuickLaunch=0
110-StartMenu3_CreateOnDesktop=0
111-StartMenu3_CreateOnStartup=0
112-StartMenu3_CreateOnStartRoot=0
113-StartMenu3_NoCreateInGroup=0
114-UseUnInstall=1
115-UseEXEpressUninstaller=1
116-UseEXEpressUninstallerFolder=
117-UnInstallTitle=FFFTP
118-UnInstallKey=FFFTP
119-UnInstallFile=
120-UnInstallArgs=
121-UninstIconFile=
122-UninstallRebootable=1
123-AutoUninstIni=1
124-AutoDeleteDat=0
125-UnInstallPublisher=
126-UnInstallSupportLink=
127-UnInstallHelpLink=
128-UnInstallUpdateLink=
129-UninstallReg0=HKEY_CURRENT_USER\Sota\FFFTP
130-UseAutoExecute=0
131-CmdLine=
132-CmdArgs=
133-AfterDeleteFiles=0
134-InstallShield=0
135-64bitSFX=0
136-ModifyOSVersion=0
137-ModifySubSysVersion=0
138-SFXOSMajor=4
139-SFXOSMinor=0
140-SFXSubSysMajor=4
141-SFXSubSysMinor=0
142-ModifyManifest=0
143-ManifestFile=
1+[EXEpress]
2+UseExtensionModuleFile=0
3+ExtensionModuleFile=
4+ExtensionModuleDatFile=
5+NoUI=0
6+SrcArchiveFile=ffftp.cab
7+DstExeFile=ffftp.exe
8+DialogTitle=FFFTP Ver.1.99
9+ForFreeSoftWare=0
10+EXEpressFor=EXEpress CX 5 Professional Licensed Edition
11+Greeting0=FFFTPをインストールします。
12+Greeting1=[次へ(N)]を押してください。
13+Greeting2=
14+IconFile=
15+IconTypeIndex=1
16+UseBannerFile=1
17+NoExtractBannerFile=1
18+BannerFile=banner.bmp
19+UseURL=1
20+HPTitle=このプログラムのウェブサイトにアクセスしますか?
21+URL=http://sourceforge.jp/projects/ffftp/
22+NoSaveInstallPath=0
23+FailIfPathRegNotExist=0
24+OnlyAdmin=0
25+DenyUsers=1
26+NoCRCCheck=0
27+BootOSCheck=1
28+BootOSFlag=1008
29+BootableOSFlag=1008
30+Deny64bitMode=0
31+CheckTrust=0
32+UsePanelBitmap=0
33+NoExtractPanelBitmap=0
34+PanelBitmap=
35+UseNewWizard=0
36+UseWiz97PanelBitmap=0
37+NoExtractWiz97PanelBitmap=0
38+Wiz97PanelBitmap=
39+UseBackScreen=0
40+BackScreenText=
41+BackScreenColor=0,0,255
42+BackScreenLogoBmp=
43+UseBackScreenLogoBmp=0
44+ExtractScreenLogo=1
45+UseExplain=1
46+ExplainFile=FFFTP.txt
47+NoExtractExplainFile=0
48+ExplainToConsent=0
49+ExplainAllRead=0
50+UseSaveExplainShowFlag=0
51+SaveExplainShowFlagRootKey=1
52+SaveExplainShowFlagKey=Software\EXEpress Programs
53+SaveExplainShowFlagValue=SetupShowExplainFlag
54+AskExtPath=1
55+UseExtractFolder=1
56+BaseFolder=0
57+ExtractFolder=ffftp
58+AskOverwrite=0
59+HideAskOverWrite=0
60+AddFileTitle=0
61+WithAttribute=0
62+NoAskMakeDir=0
63+ForceUninstallDir=0
64+OverWriteMethod=0
65+NoOverwriteNewTimeStamp=0
66+NoOpenFolderOnEnd=0
67+UseSavePath=1
68+SavePathRootKey=2
69+SavePathKey=Software\Sota\FFFTP
70+SavePathValue=InstallDir
71+StartMenuToCommon=1
72+UseStartMenu=1
73+StartMenuGroup=FFFTP
74+StartMenu0_Title=FFFTP
75+StartMenu0_File=FFFTP.exe
76+StartMenu0_Args=
77+StartMenu0_Comment=
78+StartMenu0_Icon=
79+StartMenu0_CreateOnQuickLaunch=0
80+StartMenu0_CreateOnDesktop=1
81+StartMenu0_CreateOnStartup=0
82+StartMenu0_CreateOnStartRoot=0
83+StartMenu0_NoCreateInGroup=0
84+StartMenu1_Title=FFFTPについて
85+StartMenu1_File=FFFTP.txt
86+StartMenu1_Args=
87+StartMenu1_Comment=
88+StartMenu1_Icon=
89+StartMenu1_CreateOnQuickLaunch=0
90+StartMenu1_CreateOnDesktop=0
91+StartMenu1_CreateOnStartup=0
92+StartMenu1_CreateOnStartRoot=0
93+StartMenu1_NoCreateInGroup=0
94+StartMenu2_Title=FFFTPのヘルプ
95+StartMenu2_File=FFFTP.CHM
96+StartMenu2_Args=
97+StartMenu2_Comment=
98+StartMenu2_Icon=
99+StartMenu2_CreateOnQuickLaunch=0
100+StartMenu2_CreateOnDesktop=0
101+StartMenu2_CreateOnStartup=0
102+StartMenu2_CreateOnStartRoot=0
103+StartMenu2_NoCreateInGroup=0
104+StartMenu3_Title=FFFTPの改版履歴
105+StartMenu3_File=history.txt
106+StartMenu3_Args=
107+StartMenu3_Comment=
108+StartMenu3_Icon=
109+StartMenu3_CreateOnQuickLaunch=0
110+StartMenu3_CreateOnDesktop=0
111+StartMenu3_CreateOnStartup=0
112+StartMenu3_CreateOnStartRoot=0
113+StartMenu3_NoCreateInGroup=0
114+UseUnInstall=1
115+UseEXEpressUninstaller=1
116+UseEXEpressUninstallerFolder=
117+UnInstallTitle=FFFTP
118+UnInstallKey=FFFTP
119+UnInstallFile=
120+UnInstallArgs=
121+UninstIconFile=
122+UninstallRebootable=1
123+AutoUninstIni=1
124+AutoDeleteDat=0
125+UnInstallPublisher=
126+UnInstallSupportLink=
127+UnInstallHelpLink=
128+UnInstallUpdateLink=
129+UninstallReg0=HKEY_CURRENT_USER\Sota\FFFTP
130+UseAutoExecute=0
131+CmdLine=
132+CmdArgs=
133+AfterDeleteFiles=0
134+InstallShield=0
135+64bitSFX=0
136+ModifyOSVersion=0
137+ModifySubSysVersion=0
138+SFXOSMajor=4
139+SFXOSMinor=0
140+SFXSubSysMajor=4
141+SFXSubSysMinor=0
142+ModifyManifest=0
143+ManifestFile=
--- a/dist/Microsoft.VC90.CRT.manifest
+++ b/dist/Microsoft.VC90.CRT.manifest
@@ -1,12 +1,12 @@
1-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
3- <assemblyIdentity
4- type="win32"
5- name="Microsoft.VC90.CRT"
6- version="9.0.21022.8"
7- processorArchitecture="x86"
8- publicKeyToken="1fc8b3b9a1e18e3b"
9- />
10- <file name="msvcr90.dll"/>
11-</assembly>
12-
1+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
3+ <assemblyIdentity
4+ type="win32"
5+ name="Microsoft.VC90.CRT"
6+ version="9.0.21022.8"
7+ processorArchitecture="x86"
8+ publicKeyToken="1fc8b3b9a1e18e3b"
9+ />
10+ <file name="msvcr90.dll"/>
11+</assembly>
12+
--- a/encutf8/ReadMe.txt
+++ b/encutf8/ReadMe.txt
@@ -1,29 +1,29 @@
1-========================================================================
2- コンソール アプリケーション : encutf8 プロジェクトの概要
3-========================================================================
4-
5-この encutf8 アプリケーションは、AppWizard によって作成されました。
6-
7-このファイルには、encutf8 アプリケーションを構成する各ファイル
8-の内容の概略が記述されています。
9-
10-
11-encutf8.vcproj
12- これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。
13- ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。
14-
15-encutf8.cpp
16- これは、メインのアプリケーション ソース ファイルです。
17-
18-/////////////////////////////////////////////////////////////////////////////
19-その他の標準ファイル :
20-
21-StdAfx.h, StdAfx.cpp
22- これらのファイルは、プリコンパイル済みヘッダー (PCH) ファイル encutf8.pch とプリコンパイル済み型ファイル StdAfx.obj をビルドするために使用されます。
23-
24-/////////////////////////////////////////////////////////////////////////////
25-その他のメモ :
26-
27-AppWizard では、ユーザーが追加またはカスタマイズする必要のあるソース コードの部分を示すために、"TODO:" コメントを使用します。
28-
29-/////////////////////////////////////////////////////////////////////////////
1+========================================================================
2+ コンソール アプリケーション : encutf8 プロジェクトの概要
3+========================================================================
4+
5+この encutf8 アプリケーションは、AppWizard によって作成されました。
6+
7+このファイルには、encutf8 アプリケーションを構成する各ファイル
8+の内容の概略が記述されています。
9+
10+
11+encutf8.vcproj
12+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。
13+ ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。
14+
15+encutf8.cpp
16+ これは、メインのアプリケーション ソース ファイルです。
17+
18+/////////////////////////////////////////////////////////////////////////////
19+その他の標準ファイル :
20+
21+StdAfx.h, StdAfx.cpp
22+ これらのファイルは、プリコンパイル済みヘッダー (PCH) ファイル encutf8.pch とプリコンパイル済み型ファイル StdAfx.obj をビルドするために使用されます。
23+
24+/////////////////////////////////////////////////////////////////////////////
25+その他のメモ :
26+
27+AppWizard では、ユーザーが追加またはカスタマイズする必要のあるソース コードの部分を示すために、"TODO:" コメントを使用します。
28+
29+/////////////////////////////////////////////////////////////////////////////
--- a/encutf8/encutf8.cpp
+++ b/encutf8/encutf8.cpp
@@ -1,63 +1,63 @@
1-// encutf8.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
2-//
3-
4-#include "stdafx.h"
5-
6-
7-int _tmain(int argc, _TCHAR* argv[])
8-{
9- FILE* fpIn;
10- FILE* fpOut;
11- fpos_t Length;
12- int InLength;
13- char* pInBuffer;
14- int UTF16Length;
15- wchar_t* pUTF16Buffer;
16- int OutLength;
17- char* pOutBuffer;
18- _tsetlocale(LC_ALL, _T(""));
19- if(argc != 3)
20- {
21- _tprintf(_T("マルチバイト文字(コードページ932またはShift JIS)で書かれたテキストファイルをUTF-8にエンコードします。\n"));
22- _tprintf(_T("コマンドライン\n"));
23- _tprintf(_T("encutf8 [in] [out]\n"));
24- _tprintf(_T("[in] 元のソースファイルのファイル名\n"));
25- _tprintf(_T("[out] 保存先のファイル名\n"));
26- return 0;
27- }
28- fpIn = _tfopen(argv[1], _T("rb"));
29- if(!fpIn)
30- {
31- _tprintf(_T("ファイル\"%s\"が開けません。\n"), argv[1]);
32- return 0;
33- }
34- fseek(fpIn, 0, SEEK_END);
35- fgetpos(fpIn, &Length);
36- fseek(fpIn, 0, SEEK_SET);
37- InLength = Length / sizeof(char);
38- pInBuffer = new char[InLength];
39- UTF16Length = InLength;
40- pUTF16Buffer = new wchar_t[InLength];
41- OutLength = InLength * 4;
42- pOutBuffer = new char[OutLength];
43- if(!pInBuffer || !pUTF16Buffer || !pOutBuffer)
44- {
45- _tprintf(_T("メモリが確保できません。\n"));
46- return 0;
47- }
48- fread(pInBuffer, 1, InLength, fpIn);
49- fclose(fpIn);
50- fpOut = _tfopen(argv[2], _T("wb"));
51- if(!fpIn)
52- {
53- _tprintf(_T("ファイル\"%s\"が作成できません。\n"), argv[2]);
54- return 0;
55- }
56- fwrite("\xEF\xBB\xBF", 1, 3, fpOut);
57- UTF16Length = MultiByteToWideChar(CP_ACP, 0, pInBuffer, InLength / sizeof(char), pUTF16Buffer, UTF16Length);
58- OutLength = WideCharToMultiByte(CP_UTF8, 0, pUTF16Buffer, UTF16Length, pOutBuffer, OutLength / sizeof(char), NULL, NULL);
59- fwrite(pOutBuffer, sizeof(char), OutLength, fpOut);
60- fclose(fpOut);
61- return 0;
62-}
63-
1+// encutf8.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
2+//
3+
4+#include "stdafx.h"
5+
6+
7+int _tmain(int argc, _TCHAR* argv[])
8+{
9+ FILE* fpIn;
10+ FILE* fpOut;
11+ fpos_t Length;
12+ int InLength;
13+ char* pInBuffer;
14+ int UTF16Length;
15+ wchar_t* pUTF16Buffer;
16+ int OutLength;
17+ char* pOutBuffer;
18+ _tsetlocale(LC_ALL, _T(""));
19+ if(argc != 3)
20+ {
21+ _tprintf(_T("マルチバイト文字(コードページ932またはShift JIS)で書かれたテキストファイルをUTF-8にエンコードします。\n"));
22+ _tprintf(_T("コマンドライン\n"));
23+ _tprintf(_T("encutf8 [in] [out]\n"));
24+ _tprintf(_T("[in] 元のソースファイルのファイル名\n"));
25+ _tprintf(_T("[out] 保存先のファイル名\n"));
26+ return 0;
27+ }
28+ fpIn = _tfopen(argv[1], _T("rb"));
29+ if(!fpIn)
30+ {
31+ _tprintf(_T("ファイル\"%s\"が開けません。\n"), argv[1]);
32+ return 0;
33+ }
34+ fseek(fpIn, 0, SEEK_END);
35+ fgetpos(fpIn, &Length);
36+ fseek(fpIn, 0, SEEK_SET);
37+ InLength = Length / sizeof(char);
38+ pInBuffer = new char[InLength];
39+ UTF16Length = InLength;
40+ pUTF16Buffer = new wchar_t[InLength];
41+ OutLength = InLength * 4;
42+ pOutBuffer = new char[OutLength];
43+ if(!pInBuffer || !pUTF16Buffer || !pOutBuffer)
44+ {
45+ _tprintf(_T("メモリが確保できません。\n"));
46+ return 0;
47+ }
48+ fread(pInBuffer, 1, InLength, fpIn);
49+ fclose(fpIn);
50+ fpOut = _tfopen(argv[2], _T("wb"));
51+ if(!fpIn)
52+ {
53+ _tprintf(_T("ファイル\"%s\"が作成できません。\n"), argv[2]);
54+ return 0;
55+ }
56+ fwrite("\xEF\xBB\xBF", 1, 3, fpOut);
57+ UTF16Length = MultiByteToWideChar(CP_ACP, 0, pInBuffer, InLength / sizeof(char), pUTF16Buffer, UTF16Length);
58+ OutLength = WideCharToMultiByte(CP_UTF8, 0, pUTF16Buffer, UTF16Length, pOutBuffer, OutLength / sizeof(char), NULL, NULL);
59+ fwrite(pOutBuffer, sizeof(char), OutLength, fpOut);
60+ fclose(fpOut);
61+ return 0;
62+}
63+
--- a/encutf8/encutf8.sln
+++ b/encutf8/encutf8.sln
@@ -1,20 +1,20 @@
1-
2-Microsoft Visual Studio Solution File, Format Version 10.00
3-# Visual Studio 2008
4-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encutf8", "encutf8.vcproj", "{655A8FD3-5998-472F-8906-F0A028B70C4F}"
5-EndProject
6-Global
7- GlobalSection(SolutionConfigurationPlatforms) = preSolution
8- Debug|Win32 = Debug|Win32
9- Release|Win32 = Release|Win32
10- EndGlobalSection
11- GlobalSection(ProjectConfigurationPlatforms) = postSolution
12- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.ActiveCfg = Debug|Win32
13- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.Build.0 = Debug|Win32
14- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.ActiveCfg = Release|Win32
15- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.Build.0 = Release|Win32
16- EndGlobalSection
17- GlobalSection(SolutionProperties) = preSolution
18- HideSolutionNode = FALSE
19- EndGlobalSection
20-EndGlobal
1+
2+Microsoft Visual Studio Solution File, Format Version 10.00
3+# Visual Studio 2008
4+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "encutf8", "encutf8.vcproj", "{655A8FD3-5998-472F-8906-F0A028B70C4F}"
5+EndProject
6+Global
7+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
8+ Debug|Win32 = Debug|Win32
9+ Release|Win32 = Release|Win32
10+ EndGlobalSection
11+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
12+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.ActiveCfg = Debug|Win32
13+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.Build.0 = Debug|Win32
14+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.ActiveCfg = Release|Win32
15+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.Build.0 = Release|Win32
16+ EndGlobalSection
17+ GlobalSection(SolutionProperties) = preSolution
18+ HideSolutionNode = FALSE
19+ EndGlobalSection
20+EndGlobal
--- a/encutf8/encutf8.vcproj
+++ b/encutf8/encutf8.vcproj
@@ -1,225 +1,225 @@
1-<?xml version="1.0" encoding="shift_jis"?>
2-<VisualStudioProject
3- ProjectType="Visual C++"
4- Version="9.00"
5- Name="encutf8"
6- ProjectGUID="{655A8FD3-5998-472F-8906-F0A028B70C4F}"
7- RootNamespace="encutf8"
8- Keyword="Win32Proj"
9- TargetFrameworkVersion="196613"
10- >
11- <Platforms>
12- <Platform
13- Name="Win32"
14- />
15- </Platforms>
16- <ToolFiles>
17- </ToolFiles>
18- <Configurations>
19- <Configuration
20- Name="Debug|Win32"
21- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
22- IntermediateDirectory="$(ConfigurationName)"
23- ConfigurationType="1"
24- CharacterSet="1"
25- >
26- <Tool
27- Name="VCPreBuildEventTool"
28- />
29- <Tool
30- Name="VCCustomBuildTool"
31- />
32- <Tool
33- Name="VCXMLDataGeneratorTool"
34- />
35- <Tool
36- Name="VCWebServiceProxyGeneratorTool"
37- />
38- <Tool
39- Name="VCMIDLTool"
40- />
41- <Tool
42- Name="VCCLCompilerTool"
43- Optimization="0"
44- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
45- MinimalRebuild="true"
46- BasicRuntimeChecks="3"
47- RuntimeLibrary="3"
48- UsePrecompiledHeader="2"
49- WarningLevel="3"
50- DebugInformationFormat="4"
51- />
52- <Tool
53- Name="VCManagedResourceCompilerTool"
54- />
55- <Tool
56- Name="VCResourceCompilerTool"
57- />
58- <Tool
59- Name="VCPreLinkEventTool"
60- />
61- <Tool
62- Name="VCLinkerTool"
63- LinkIncremental="2"
64- GenerateDebugInformation="true"
65- SubSystem="1"
66- TargetMachine="1"
67- />
68- <Tool
69- Name="VCALinkTool"
70- />
71- <Tool
72- Name="VCManifestTool"
73- />
74- <Tool
75- Name="VCXDCMakeTool"
76- />
77- <Tool
78- Name="VCBscMakeTool"
79- />
80- <Tool
81- Name="VCFxCopTool"
82- />
83- <Tool
84- Name="VCAppVerifierTool"
85- />
86- <Tool
87- Name="VCPostBuildEventTool"
88- />
89- </Configuration>
90- <Configuration
91- Name="Release|Win32"
92- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
93- IntermediateDirectory="$(ConfigurationName)"
94- ConfigurationType="1"
95- CharacterSet="1"
96- WholeProgramOptimization="1"
97- >
98- <Tool
99- Name="VCPreBuildEventTool"
100- />
101- <Tool
102- Name="VCCustomBuildTool"
103- />
104- <Tool
105- Name="VCXMLDataGeneratorTool"
106- />
107- <Tool
108- Name="VCWebServiceProxyGeneratorTool"
109- />
110- <Tool
111- Name="VCMIDLTool"
112- />
113- <Tool
114- Name="VCCLCompilerTool"
115- Optimization="2"
116- EnableIntrinsicFunctions="true"
117- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
118- RuntimeLibrary="2"
119- EnableFunctionLevelLinking="true"
120- UsePrecompiledHeader="2"
121- WarningLevel="3"
122- DebugInformationFormat="3"
123- />
124- <Tool
125- Name="VCManagedResourceCompilerTool"
126- />
127- <Tool
128- Name="VCResourceCompilerTool"
129- />
130- <Tool
131- Name="VCPreLinkEventTool"
132- />
133- <Tool
134- Name="VCLinkerTool"
135- LinkIncremental="1"
136- GenerateDebugInformation="true"
137- SubSystem="1"
138- OptimizeReferences="2"
139- EnableCOMDATFolding="2"
140- TargetMachine="1"
141- />
142- <Tool
143- Name="VCALinkTool"
144- />
145- <Tool
146- Name="VCManifestTool"
147- />
148- <Tool
149- Name="VCXDCMakeTool"
150- />
151- <Tool
152- Name="VCBscMakeTool"
153- />
154- <Tool
155- Name="VCFxCopTool"
156- />
157- <Tool
158- Name="VCAppVerifierTool"
159- />
160- <Tool
161- Name="VCPostBuildEventTool"
162- />
163- </Configuration>
164- </Configurations>
165- <References>
166- </References>
167- <Files>
168- <Filter
169- Name="ソース ファイル"
170- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
171- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
172- >
173- <File
174- RelativePath=".\encutf8.cpp"
175- >
176- </File>
177- <File
178- RelativePath=".\stdafx.cpp"
179- >
180- <FileConfiguration
181- Name="Debug|Win32"
182- >
183- <Tool
184- Name="VCCLCompilerTool"
185- UsePrecompiledHeader="1"
186- />
187- </FileConfiguration>
188- <FileConfiguration
189- Name="Release|Win32"
190- >
191- <Tool
192- Name="VCCLCompilerTool"
193- UsePrecompiledHeader="1"
194- />
195- </FileConfiguration>
196- </File>
197- </Filter>
198- <Filter
199- Name="ヘッダー ファイル"
200- Filter="h;hpp;hxx;hm;inl;inc;xsd"
201- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
202- >
203- <File
204- RelativePath=".\stdafx.h"
205- >
206- </File>
207- <File
208- RelativePath=".\targetver.h"
209- >
210- </File>
211- </Filter>
212- <Filter
213- Name="リソース ファイル"
214- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
215- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
216- >
217- </Filter>
218- <File
219- RelativePath=".\ReadMe.txt"
220- >
221- </File>
222- </Files>
223- <Globals>
224- </Globals>
225-</VisualStudioProject>
1+<?xml version="1.0" encoding="shift_jis"?>
2+<VisualStudioProject
3+ ProjectType="Visual C++"
4+ Version="9.00"
5+ Name="encutf8"
6+ ProjectGUID="{655A8FD3-5998-472F-8906-F0A028B70C4F}"
7+ RootNamespace="encutf8"
8+ Keyword="Win32Proj"
9+ TargetFrameworkVersion="196613"
10+ >
11+ <Platforms>
12+ <Platform
13+ Name="Win32"
14+ />
15+ </Platforms>
16+ <ToolFiles>
17+ </ToolFiles>
18+ <Configurations>
19+ <Configuration
20+ Name="Debug|Win32"
21+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
22+ IntermediateDirectory="$(ConfigurationName)"
23+ ConfigurationType="1"
24+ CharacterSet="1"
25+ >
26+ <Tool
27+ Name="VCPreBuildEventTool"
28+ />
29+ <Tool
30+ Name="VCCustomBuildTool"
31+ />
32+ <Tool
33+ Name="VCXMLDataGeneratorTool"
34+ />
35+ <Tool
36+ Name="VCWebServiceProxyGeneratorTool"
37+ />
38+ <Tool
39+ Name="VCMIDLTool"
40+ />
41+ <Tool
42+ Name="VCCLCompilerTool"
43+ Optimization="0"
44+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
45+ MinimalRebuild="true"
46+ BasicRuntimeChecks="3"
47+ RuntimeLibrary="3"
48+ UsePrecompiledHeader="2"
49+ WarningLevel="3"
50+ DebugInformationFormat="4"
51+ />
52+ <Tool
53+ Name="VCManagedResourceCompilerTool"
54+ />
55+ <Tool
56+ Name="VCResourceCompilerTool"
57+ />
58+ <Tool
59+ Name="VCPreLinkEventTool"
60+ />
61+ <Tool
62+ Name="VCLinkerTool"
63+ LinkIncremental="2"
64+ GenerateDebugInformation="true"
65+ SubSystem="1"
66+ TargetMachine="1"
67+ />
68+ <Tool
69+ Name="VCALinkTool"
70+ />
71+ <Tool
72+ Name="VCManifestTool"
73+ />
74+ <Tool
75+ Name="VCXDCMakeTool"
76+ />
77+ <Tool
78+ Name="VCBscMakeTool"
79+ />
80+ <Tool
81+ Name="VCFxCopTool"
82+ />
83+ <Tool
84+ Name="VCAppVerifierTool"
85+ />
86+ <Tool
87+ Name="VCPostBuildEventTool"
88+ />
89+ </Configuration>
90+ <Configuration
91+ Name="Release|Win32"
92+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
93+ IntermediateDirectory="$(ConfigurationName)"
94+ ConfigurationType="1"
95+ CharacterSet="1"
96+ WholeProgramOptimization="1"
97+ >
98+ <Tool
99+ Name="VCPreBuildEventTool"
100+ />
101+ <Tool
102+ Name="VCCustomBuildTool"
103+ />
104+ <Tool
105+ Name="VCXMLDataGeneratorTool"
106+ />
107+ <Tool
108+ Name="VCWebServiceProxyGeneratorTool"
109+ />
110+ <Tool
111+ Name="VCMIDLTool"
112+ />
113+ <Tool
114+ Name="VCCLCompilerTool"
115+ Optimization="2"
116+ EnableIntrinsicFunctions="true"
117+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
118+ RuntimeLibrary="2"
119+ EnableFunctionLevelLinking="true"
120+ UsePrecompiledHeader="2"
121+ WarningLevel="3"
122+ DebugInformationFormat="3"
123+ />
124+ <Tool
125+ Name="VCManagedResourceCompilerTool"
126+ />
127+ <Tool
128+ Name="VCResourceCompilerTool"
129+ />
130+ <Tool
131+ Name="VCPreLinkEventTool"
132+ />
133+ <Tool
134+ Name="VCLinkerTool"
135+ LinkIncremental="1"
136+ GenerateDebugInformation="true"
137+ SubSystem="1"
138+ OptimizeReferences="2"
139+ EnableCOMDATFolding="2"
140+ TargetMachine="1"
141+ />
142+ <Tool
143+ Name="VCALinkTool"
144+ />
145+ <Tool
146+ Name="VCManifestTool"
147+ />
148+ <Tool
149+ Name="VCXDCMakeTool"
150+ />
151+ <Tool
152+ Name="VCBscMakeTool"
153+ />
154+ <Tool
155+ Name="VCFxCopTool"
156+ />
157+ <Tool
158+ Name="VCAppVerifierTool"
159+ />
160+ <Tool
161+ Name="VCPostBuildEventTool"
162+ />
163+ </Configuration>
164+ </Configurations>
165+ <References>
166+ </References>
167+ <Files>
168+ <Filter
169+ Name="ソース ファイル"
170+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
171+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
172+ >
173+ <File
174+ RelativePath=".\encutf8.cpp"
175+ >
176+ </File>
177+ <File
178+ RelativePath=".\stdafx.cpp"
179+ >
180+ <FileConfiguration
181+ Name="Debug|Win32"
182+ >
183+ <Tool
184+ Name="VCCLCompilerTool"
185+ UsePrecompiledHeader="1"
186+ />
187+ </FileConfiguration>
188+ <FileConfiguration
189+ Name="Release|Win32"
190+ >
191+ <Tool
192+ Name="VCCLCompilerTool"
193+ UsePrecompiledHeader="1"
194+ />
195+ </FileConfiguration>
196+ </File>
197+ </Filter>
198+ <Filter
199+ Name="ヘッダー ファイル"
200+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
201+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
202+ >
203+ <File
204+ RelativePath=".\stdafx.h"
205+ >
206+ </File>
207+ <File
208+ RelativePath=".\targetver.h"
209+ >
210+ </File>
211+ </Filter>
212+ <Filter
213+ Name="リソース ファイル"
214+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
215+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
216+ >
217+ </Filter>
218+ <File
219+ RelativePath=".\ReadMe.txt"
220+ >
221+ </File>
222+ </Files>
223+ <Globals>
224+ </Globals>
225+</VisualStudioProject>
--- a/encutf8/stdafx.cpp
+++ b/encutf8/stdafx.cpp
@@ -1,8 +1,8 @@
1-// stdafx.cpp : 標準インクルード encutf8.pch のみを
2-// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
3-// stdafx.obj にはプリコンパイル済み型情報が含まれます。
4-
5-#include "stdafx.h"
6-
7-// TODO: このファイルではなく、STDAFX.H で必要な
8-// 追加ヘッダーを参照してください。
1+// stdafx.cpp : 標準インクルード encutf8.pch のみを
2+// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
3+// stdafx.obj にはプリコンパイル済み型情報が含まれます。
4+
5+#include "stdafx.h"
6+
7+// TODO: このファイルではなく、STDAFX.H で必要な
8+// 追加ヘッダーを参照してください。
--- a/encutf8/stdafx.h
+++ b/encutf8/stdafx.h
@@ -1,19 +1,19 @@
1-// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
2-// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
3-// を記述します。
4-//
5-
6-#pragma once
7-
8-#include "targetver.h"
9-
10-#include <stdio.h>
11-#include <tchar.h>
12-
13-
14-
15-// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
16-
17-#include <locale.h>
18-#include <windows.h>
19-
1+// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
2+// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
3+// を記述します。
4+//
5+
6+#pragma once
7+
8+#include "targetver.h"
9+
10+#include <stdio.h>
11+#include <tchar.h>
12+
13+
14+
15+// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
16+
17+#include <locale.h>
18+#include <windows.h>
19+
--- a/encutf8/targetver.h
+++ b/encutf8/targetver.h
@@ -1,13 +1,13 @@
1-#pragma once
2-
3-// 以下のマクロは、最低限必要なプラットフォームを定義します。最低限必要なプラットフォームとは、
4-// アプリケーションを実行するために必要な機能を備えた最も古いバージョンの Windows や Internet Explorer など
5-// をいいます。これらのマクロは、指定したバージョンと、それ以前のバージョンのプラットフォーム上で利用できるすべての機能を有効にすることによって
6-// 動作します。
7-
8-// 下で指定された定義の前に対象プラットフォームを指定しなければならない場合、以下の定義を変更してください。
9-// 異なるプラットフォームに対応する値に関する最新情報については、MSDN を参照してください。
10-#ifndef _WIN32_WINNT // 最低限必要なプラットフォームが Windows Vista であることを指定します。
11-#define _WIN32_WINNT 0x0600 // これを Windows の他のバージョン向けに適切な値に変更してください。
12-#endif
13-
1+#pragma once
2+
3+// 以下のマクロは、最低限必要なプラットフォームを定義します。最低限必要なプラットフォームとは、
4+// アプリケーションを実行するために必要な機能を備えた最も古いバージョンの Windows や Internet Explorer など
5+// をいいます。これらのマクロは、指定したバージョンと、それ以前のバージョンのプラットフォーム上で利用できるすべての機能を有効にすることによって
6+// 動作します。
7+
8+// 下で指定された定義の前に対象プラットフォームを指定しなければならない場合、以下の定義を変更してください。
9+// 異なるプラットフォームに対応する値に関する最新情報については、MSDN を参照してください。
10+#ifndef _WIN32_WINNT // 最低限必要なプラットフォームが Windows Vista であることを指定します。
11+#define _WIN32_WINNT 0x0600 // これを Windows の他のバージョン向けに適切な値に変更してください。
12+#endif
13+
--- a/howtobuild.htm
+++ b/howtobuild.htm
@@ -1,54 +1,54 @@
1-<html>
2-<head>
3-<title>SourceForge.JP版FFFTPのビルドおよび開発の手順について</title>
4-<style type="text/css">
5-.filename {font-weight:bold}
6-</style>
7-</head>
8-<body>
9-SourceForge.JP版<span style="font-weight:bold"><span style="color:yellow;vertical-align:super">F</span><span style="color:green">F</span><span style="color:red;vertical-align:sub">F</span><span style="color:green">TP</span></span>のビルドおよび開発の手順について<br>
10-<ol>
11- <li>ビルドの手順<br>
12- FFFTPをビルドするには以下の手順に従ってください。
13- <ol>
14- <li>Visual C++ 2005を使用する場合
15- <ol>
16- <li><span class="filename">"FFFTP.sln"</span>を開く。
17- <li>必要に応じてソースコードを編集する。
18- <ol>
19- <li>プロジェクトはマルチバイト文字(Shift_JIS)用に設定されているが、ファイル名のUTF-8対応に伴い、実際の内部形式はUTF-8として扱っている(構造については<span class="filename">"mbswrapper.c"</span>およびその他のソースコード内のコメントを参照)。
20- <li>メッセージ文字列については<span class="filename">"mesg-jpn.h"</span>および<span class="filename">"mesg-eng.h"</span>に記述されているが、編集する際は<span class="filename">"mesg-jpn.old.h"</span>および<span class="filename">"mesg-eng.old.h"</span>をShift_JISで保存し、<span class="filename">"mbtoutf8.bat"</span>を実行して文字列リテラルをUTF-8に変換する。
21- </ol>
22- <li>必要に応じてリソースを編集する。
23- <ol>
24- <li>追加の依存ライブラリの著作権情報は、ダイアログabout_dlgの「FFFTPはfreewareです」の上のテキストに追記してください。<br>
25- 今後の機能追加に伴い著作権情報が増える見込みのため、テキストの範囲を大きめに設定してあります。
26- </ol>
27- <li>ソリューション構成から「Debug」または「Release」を選択する。
28- <li>メニューから「ソリューションのビルド」を選択する。
29- <li>問題が無ければ<span class="filename">"Debug\FFFTP.exe"</span>または<span class="filename">"Release\FFFTP.exe"</span>が生成される。
30- </ol>
31- <li>Visual C++ 2008を使用する場合
32- <ol>
33- <li><span class="filename">"FFFTP.vc90.sln"</span>を開く。
34- <li>必要に応じてソースコードを編集する。
35- <ol>
36- <li>プロジェクトはマルチバイト文字(Shift_JIS)用に設定されているが、ファイル名のUTF-8対応に伴い、実際の内部形式はUTF-8として扱っている(構造については<span class="filename">"mbswrapper.c"</span>およびその他のソースコード内のコメントを参照)。
37- <li>メッセージ文字列については<span class="filename">"mesg-jpn.h"</span>および<span class="filename">"mesg-eng.h"</span>に記述されているが、編集する際は<span class="filename">"mesg-jpn.old.h"</span>および<span class="filename">"mesg-eng.old.h"</span>をShift_JISで保存し、<span class="filename">"mbtoutf8.bat"</span>を実行して文字列リテラルをUTF-8に変換する。
38- </ol>
39- <li>必要に応じてリソースを編集する。
40- <ol>
41- <li>追加の依存ライブラリの著作権情報は、ダイアログabout_dlgの「FFFTPはfreewareです」の上のテキストに追記してください。<br>
42- 今後の機能追加に伴い著作権情報が増える見込みのため、テキストの範囲を大きめに設定してあります。
43- </ol>
44- <li>ソリューション構成から「Debug」または「Release」を選択する。
45- <li>メニューから「ソリューションのビルド」を選択する。
46- <li>問題が無ければ<span class="filename">"Debug\FFFTP.exe"</span>または<span class="filename">"Release\FFFTP.exe"</span>が生成される。
47- </ol>
48- </ol>
49-</ol>
50-質問やサポートはこちらまで。<br>
51-<a href="http://sourceforge.jp/projects/ffftp/">http://sourceforge.jp/projects/ffftp/</a>
52-
53-</body>
54-</html>
1+<html>
2+<head>
3+<title>SourceForge.JP版FFFTPのビルドおよび開発の手順について</title>
4+<style type="text/css">
5+.filename {font-weight:bold}
6+</style>
7+</head>
8+<body>
9+SourceForge.JP版<span style="font-weight:bold"><span style="color:yellow;vertical-align:super">F</span><span style="color:green">F</span><span style="color:red;vertical-align:sub">F</span><span style="color:green">TP</span></span>のビルドおよび開発の手順について<br>
10+<ol>
11+ <li>ビルドの手順<br>
12+ FFFTPをビルドするには以下の手順に従ってください。
13+ <ol>
14+ <li>Visual C++ 2005を使用する場合
15+ <ol>
16+ <li><span class="filename">"FFFTP.sln"</span>を開く。
17+ <li>必要に応じてソースコードを編集する。
18+ <ol>
19+ <li>プロジェクトはマルチバイト文字(Shift_JIS)用に設定されているが、ファイル名のUTF-8対応に伴い、実際の内部形式はUTF-8として扱っている(構造については<span class="filename">"mbswrapper.c"</span>およびその他のソースコード内のコメントを参照)。
20+ <li>メッセージ文字列については<span class="filename">"mesg-jpn.h"</span>および<span class="filename">"mesg-eng.h"</span>に記述されているが、編集する際は<span class="filename">"mesg-jpn.old.h"</span>および<span class="filename">"mesg-eng.old.h"</span>をShift_JISで保存し、<span class="filename">"mbtoutf8.bat"</span>を実行して文字列リテラルをUTF-8に変換する。
21+ </ol>
22+ <li>必要に応じてリソースを編集する。
23+ <ol>
24+ <li>追加の依存ライブラリの著作権情報は、ダイアログabout_dlgの「FFFTPはfreewareです」の上のテキストに追記してください。<br>
25+ 今後の機能追加に伴い著作権情報が増える見込みのため、テキストの範囲を大きめに設定してあります。
26+ </ol>
27+ <li>ソリューション構成から「Debug」または「Release」を選択する。
28+ <li>メニューから「ソリューションのビルド」を選択する。
29+ <li>問題が無ければ<span class="filename">"Debug\FFFTP.exe"</span>または<span class="filename">"Release\FFFTP.exe"</span>が生成される。
30+ </ol>
31+ <li>Visual C++ 2008を使用する場合
32+ <ol>
33+ <li><span class="filename">"FFFTP.vc90.sln"</span>を開く。
34+ <li>必要に応じてソースコードを編集する。
35+ <ol>
36+ <li>プロジェクトはマルチバイト文字(Shift_JIS)用に設定されているが、ファイル名のUTF-8対応に伴い、実際の内部形式はUTF-8として扱っている(構造については<span class="filename">"mbswrapper.c"</span>およびその他のソースコード内のコメントを参照)。
37+ <li>メッセージ文字列については<span class="filename">"mesg-jpn.h"</span>および<span class="filename">"mesg-eng.h"</span>に記述されているが、編集する際は<span class="filename">"mesg-jpn.old.h"</span>および<span class="filename">"mesg-eng.old.h"</span>をShift_JISで保存し、<span class="filename">"mbtoutf8.bat"</span>を実行して文字列リテラルをUTF-8に変換する。
38+ </ol>
39+ <li>必要に応じてリソースを編集する。
40+ <ol>
41+ <li>追加の依存ライブラリの著作権情報は、ダイアログabout_dlgの「FFFTPはfreewareです」の上のテキストに追記してください。<br>
42+ 今後の機能追加に伴い著作権情報が増える見込みのため、テキストの範囲を大きめに設定してあります。
43+ </ol>
44+ <li>ソリューション構成から「Debug」または「Release」を選択する。
45+ <li>メニューから「ソリューションのビルド」を選択する。
46+ <li>問題が無ければ<span class="filename">"Debug\FFFTP.exe"</span>または<span class="filename">"Release\FFFTP.exe"</span>が生成される。
47+ </ol>
48+ </ol>
49+</ol>
50+質問やサポートはこちらまで。<br>
51+<a href="http://sourceforge.jp/projects/ffftp/">http://sourceforge.jp/projects/ffftp/</a>
52+
53+</body>
54+</html>
--- a/htmlhelp/HTML/H0000065.HTM
+++ b/htmlhelp/HTML/H0000065.HTM
@@ -1,15 +1,15 @@
1-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2-<HTML><HEAD><TITLE>暗号化</TITLE>
3-<META http-equiv=Content-Type content="text/html; charset=shift_jis">
4-<META content="MSHTML 6.00.6000.16546" name=GENERATOR></HEAD>
5-<BODY>
6-<P><FONT
7-color=#ff0000>ホストへの接続、ファイル一覧、アップロード、ダウンロードなどに問題が起きた時にのみ設定を変更してください。</FONT></P>
8-<P><IMG src="..\pic\dlg_hset_crypt.png"></P>
9-<P><STRONG>■FTPS (Explicit)で接続</STRONG></P>
10-<P>FTP over Explicit SSL/TLSを使用してホストとのユーザー認証およびファイル転送を行います。</P>
11-<P><STRONG>■FTPS (Implicit)で接続</STRONG></P>
12-<P>現在は未実装のため使用できません。</P>
13-<P><STRONG>■SFTPで接続</STRONG></P>
14-<P>現在は未実装のため使用できません。</P>
15-<P>&nbsp;</P></BODY></HTML>
1+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2+<HTML><HEAD><TITLE>暗号化</TITLE>
3+<META http-equiv=Content-Type content="text/html; charset=shift_jis">
4+<META content="MSHTML 6.00.6000.16546" name=GENERATOR></HEAD>
5+<BODY>
6+<P><FONT
7+color=#ff0000>ホストへの接続、ファイル一覧、アップロード、ダウンロードなどに問題が起きた時にのみ設定を変更してください。</FONT></P>
8+<P><IMG src="..\pic\dlg_hset_crypt.png"></P>
9+<P><STRONG>■FTPS (Explicit)で接続</STRONG></P>
10+<P>FTP over Explicit SSL/TLSを使用してホストとのユーザー認証およびファイル転送を行います。</P>
11+<P><STRONG>■FTPS (Implicit)で接続</STRONG></P>
12+<P>現在は未実装のため使用できません。</P>
13+<P><STRONG>■SFTPで接続</STRONG></P>
14+<P>現在は未実装のため使用できません。</P>
15+<P>&nbsp;</P></BODY></HTML>
--- a/htmlhelp/HTML/H0000066.HTM
+++ b/htmlhelp/HTML/H0000066.HTM
@@ -1,12 +1,12 @@
1-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2-<HTML><HEAD><TITLE>特殊機能</TITLE>
3-<META http-equiv=Content-Type content="text/html; charset=shift_jis">
4-<META content="MSHTML 6.00.6000.16546" name=GENERATOR></HEAD>
5-<BODY>
6-<P><FONT
7-color=#ff0000>ホストへの接続、ファイル一覧、アップロード、ダウンロードなどに問題が起きた時にのみ設定を変更してください。</FONT></P>
8-<P><IMG src="..\pic\dlg_hset_adv3.png"></P>
9-<P><STRONG>■最大同時接続数</STRONG></P>
10-<P>ホストと同時に接続できるセッション数を設定します。</P>
11-<P>この値を増やすと同時に転送できるファイル数が増えて通信速度が向上します。(非対応のホストも存在するため、通常は1に設定してください。)</P>
12-<P>&nbsp;</P></BODY></HTML>
1+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2+<HTML><HEAD><TITLE>特殊機能</TITLE>
3+<META http-equiv=Content-Type content="text/html; charset=shift_jis">
4+<META content="MSHTML 6.00.6000.16546" name=GENERATOR></HEAD>
5+<BODY>
6+<P><FONT
7+color=#ff0000>ホストへの接続、ファイル一覧、アップロード、ダウンロードなどに問題が起きた時にのみ設定を変更してください。</FONT></P>
8+<P><IMG src="..\pic\dlg_hset_adv3.png"></P>
9+<P><STRONG>■最大同時接続数</STRONG></P>
10+<P>ホストと同時に接続できるセッション数を設定します。</P>
11+<P>この値を増やすと同時に転送できるファイル数が増えて通信速度が向上します。(非対応のホストも存在するため、通常は1に設定してください。)</P>
12+<P>&nbsp;</P></BODY></HTML>
--- a/mbswrapper.c
+++ b/mbswrapper.c
@@ -1,2033 +1,2033 @@
1-// mbswrapper.c
2-// Copyright (C) 2011 Suguru Kawamoto
3-// マルチバイト文字ワイド文字APIラッパー
4-// マルチバイト文字はUTF-8、ワイド文字はUTF-16であるものとする
5-// 全ての制御用の文字はASCIIの範囲であるため、Shift_JISとUTF-8間の変換は不要
6-
7-#define UNICODE
8-#define _UNICODE
9-
10-#include <tchar.h>
11-#include <direct.h>
12-#include <windows.h>
13-#include <commctrl.h>
14-#include <shlobj.h>
15-#include <htmlhelp.h>
16-
17-#define DO_NOT_REPLACE
18-#include "mbswrapper.h"
19-
20-// マルチバイト文字列からワイド文字列へ変換
21-int MtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
22-{
23- if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
24- return 0;
25- if(pDst)
26- return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, pDst, size);
27- return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, NULL, 0);
28-}
29-
30-// ワイド文字列からマルチバイト文字列へ変換
31-int WtoM(LPSTR pDst, int size, LPCWSTR pSrc, int count)
32-{
33- if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
34- return 0;
35- if(pDst)
36- return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, pDst, size, NULL, NULL);
37- return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, NULL, 0, NULL, NULL);
38-}
39-
40-// Shift_JIS文字列からワイド文字列へ変換
41-int AtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
42-{
43- if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
44- return 0;
45- if(pDst)
46- return MultiByteToWideChar(CP_ACP, 0, pSrc, count, pDst, size);
47- return MultiByteToWideChar(CP_ACP, 0, pSrc, count, NULL, 0);
48-}
49-
50-// ワイド文字列からShift_JIS文字列へ変換
51-int WtoA(LPSTR pDst, int size, LPCWSTR pSrc, int count)
52-{
53- if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
54- return 0;
55- if(pDst)
56- return WideCharToMultiByte(CP_ACP, 0, pSrc, count, pDst, size, NULL, NULL);
57- return WideCharToMultiByte(CP_ACP, 0, pSrc, count, NULL, 0, NULL, NULL);
58-}
59-
60-// マルチバイト文字列バッファ終端を強制的にNULLで置換
61-int TerminateStringM(LPSTR lpString, int size)
62-{
63- int i;
64- if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
65- return 0;
66- for(i = 0; i < size; i++)
67- {
68- if(lpString[i] == '\0')
69- return i;
70- }
71- i--;
72- lpString[i] = '\0';
73- return i;
74-}
75-
76-// ワイド文字列バッファ終端を強制的にNULLで置換
77-int TerminateStringW(LPWSTR lpString, int size)
78-{
79- int i;
80- if(lpString < (LPWSTR)0x00010000 || lpString == (LPWSTR)~0)
81- return 0;
82- for(i = 0; i < size; i++)
83- {
84- if(lpString[i] == L'\0')
85- return i;
86- }
87- i--;
88- lpString[i] = L'\0';
89- return i;
90-}
91-
92-// Shift_JIS文字列バッファ終端を強制的にNULLで置換
93-int TerminateStringA(LPSTR lpString, int size)
94-{
95- int i;
96- if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
97- return 0;
98- for(i = 0; i < size; i++)
99- {
100- if(lpString[i] == '\0')
101- return i;
102- }
103- i--;
104- lpString[i] = '\0';
105- return i;
106-}
107-
108-// NULL区切り複数マルチバイト文字列の長さを取得
109-size_t GetMultiStringLengthM(LPCSTR lpString)
110-{
111- size_t i;
112- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
113- return 0;
114- i = 0;
115- while(lpString[i] != '\0' || lpString[i + 1] != '\0')
116- {
117- i++;
118- }
119- i++;
120- return i;
121-}
122-
123-// NULL区切り複数ワイド文字列の長さを取得
124-size_t GetMultiStringLengthW(LPCWSTR lpString)
125-{
126- size_t i;
127- if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
128- return 0;
129- i = 0;
130- while(lpString[i] != L'\0' || lpString[i + 1] != L'\0')
131- {
132- i++;
133- }
134- i++;
135- return i;
136-}
137-
138-// NULL区切り複数Shift_JIS文字列の長さを取得
139-size_t GetMultiStringLengthA(LPCSTR lpString)
140-{
141- size_t i;
142- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
143- return 0;
144- i = 0;
145- while(lpString[i] != '\0' || lpString[i + 1] != '\0')
146- {
147- i++;
148- }
149- i++;
150- return i;
151-}
152-
153-// NULL区切りマルチバイト文字列からワイド文字列へ変換
154-int MtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
155-{
156- int i;
157- if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
158- return 0;
159- if(!pDst)
160- return GetMultiStringLengthM(pSrc);
161- i = 0;
162- while(*pSrc != '\0')
163- {
164- i += MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1);
165- pSrc += strlen(pSrc) + 1;
166- }
167- pDst[i] = L'\0';
168- return i;
169-}
170-
171-// NULL区切りワイド文字列からマルチバイト文字列へ変換
172-int WtoMMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
173-{
174- int i;
175- if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
176- return 0;
177- if(!pDst)
178- return GetMultiStringLengthW(pSrc);
179- i = 0;
180- while(*pSrc != L'\0')
181- {
182- i += WideCharToMultiByte(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
183- pSrc += wcslen(pSrc) + 1;
184- }
185- pDst[i] = '\0';
186- return i;
187-}
188-
189-// NULL区切りShift_JIS文字列からワイド文字列へ変換
190-int AtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
191-{
192- int i;
193- if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
194- return 0;
195- if(!pDst)
196- return GetMultiStringLengthA(pSrc);
197- i = 0;
198- while(*pSrc != '\0')
199- {
200- i += MultiByteToWideChar(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1);
201- pSrc += strlen(pSrc) + 1;
202- }
203- pDst[i] = L'\0';
204- return i;
205-}
206-
207-// NULL区切りワイド文字列からShift_JIS文字列へ変換
208-int WtoAMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
209-{
210- int i;
211- if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
212- return 0;
213- if(!pDst)
214- return GetMultiStringLengthW(pSrc);
215- i = 0;
216- while(*pSrc != L'\0')
217- {
218- i += WideCharToMultiByte(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
219- pSrc += wcslen(pSrc) + 1;
220- }
221- pDst[i] = '\0';
222- return i;
223-}
224-
225-// マルチバイト文字列用のメモリを確保
226-char* AllocateStringM(int size)
227-{
228- char* p;
229- // 0が指定される場合があるため1文字分追加
230- p = (char*)malloc(sizeof(char) * (size + 1));
231- // 念のため先頭にNULL文字を代入
232- if(p)
233- *p = '\0';
234- return p;
235-}
236-
237-// ワイド文字列用のメモリを確保
238-wchar_t* AllocateStringW(int size)
239-{
240- wchar_t* p;
241- // 0が指定される場合があるため1文字分追加
242- p = (wchar_t*)malloc(sizeof(wchar_t) * (size + 1));
243- // 念のため先頭にNULL文字を代入
244- if(p)
245- *p = L'\0';
246- return p;
247-}
248-
249-// Shift_JIS文字列用のメモリを確保
250-char* AllocateStringA(int size)
251-{
252- char* p;
253- // 0が指定される場合があるため1文字分追加
254- p = (char*)malloc(sizeof(char) * (size + 1));
255- // 念のため先頭にNULL文字を代入
256- if(p)
257- *p = '\0';
258- return p;
259-}
260-
261-// メモリを確保してマルチバイト文字列からワイド文字列へ変換
262-// リソースIDならば元の値を返す
263-wchar_t* DuplicateMtoW(LPCSTR lpString, int c)
264-{
265- wchar_t* p;
266- int i;
267- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
268- return (wchar_t*)lpString;
269- if(c < 0)
270- c = strlen(lpString);
271- p = AllocateStringW(MtoW(NULL, 0, lpString, c) + 1);
272- if(p)
273- {
274- i = MtoW(p, 65535, lpString, c);
275- p[i] = L'\0';
276- }
277- return p;
278-}
279-
280-// 指定したサイズのメモリを確保してマルチバイト文字列からワイド文字列へ変換
281-// リソースIDならば元の値を返す
282-wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size)
283-{
284- wchar_t* p;
285- int i;
286- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
287- return (wchar_t*)lpString;
288- if(c < 0)
289- c = strlen(lpString);
290- p = AllocateStringW(size);
291- if(p)
292- {
293- i = MtoW(p, size, lpString, c);
294- p[i] = L'\0';
295- }
296- return p;
297-}
298-
299-// メモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
300-// リソースIDならば元の値を返す
301-wchar_t* DuplicateMtoWMultiString(LPCSTR lpString)
302-{
303- int count;
304- wchar_t* p;
305- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
306- return (wchar_t*)lpString;
307- count = GetMultiStringLengthM(lpString) + 1;
308- p = AllocateStringW(count);
309- if(p)
310- MtoW(p, count, lpString, count);
311- return p;
312-}
313-
314-// 指定したサイズのメモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
315-// リソースIDならば元の値を返す
316-wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size)
317-{
318- int count;
319- wchar_t* p;
320- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
321- return (wchar_t*)lpString;
322- count = GetMultiStringLengthM(lpString) + 1;
323- p = AllocateStringW(size);
324- if(p)
325- {
326- MtoW(p, size, lpString, count);
327- p[size - 2] = L'\0';
328- p[size - 1] = L'\0';
329- }
330- return p;
331-}
332-
333-// メモリを確保してワイド文字列からマルチバイト文字列へ変換
334-// リソースIDならば元の値を返す
335-char* DuplicateWtoM(LPCWSTR lpString, int c)
336-{
337- char* p;
338- int i;
339- if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
340- return (char*)lpString;
341- if(c < 0)
342- c = wcslen(lpString);
343- p = AllocateStringM(WtoM(NULL, 0, lpString, c) + 1);
344- if(p)
345- {
346- i = WtoM(p, 65535, lpString, c);
347- p[i] = L'\0';
348- }
349- return p;
350-}
351-
352-// メモリを確保してShift_JIS文字列からワイド文字列へ変換
353-// リソースIDならば元の値を返す
354-wchar_t* DuplicateAtoW(LPCSTR lpString, int c)
355-{
356- wchar_t* p;
357- int i;
358- if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
359- return (wchar_t*)lpString;
360- if(c < 0)
361- c = strlen(lpString);
362- p = AllocateStringW(AtoW(NULL, 0, lpString, c) + 1);
363- if(p)
364- {
365- i = AtoW(p, 65535, lpString, c);
366- p[i] = L'\0';
367- }
368- return p;
369-}
370-
371-// メモリを確保してワイド文字列からShift_JIS文字列へ変換
372-// リソースIDならば元の値を返す
373-char* DuplicateWtoA(LPCWSTR lpString, int c)
374-{
375- char* p;
376- int i;
377- if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
378- return (char*)lpString;
379- if(c < 0)
380- c = wcslen(lpString);
381- p = AllocateStringA(WtoA(NULL, 0, lpString, c) + 1);
382- if(p)
383- {
384- i = WtoA(p, 65535, lpString, c);
385- p[i] = L'\0';
386- }
387- return p;
388-}
389-
390-// 文字列用に確保したメモリを開放
391-// リソースIDならば何もしない
392-void FreeDuplicatedString(void* p)
393-{
394- if(p < (void*)0x00010000 || p == (void*)~0)
395- return;
396- free(p);
397-}
398-
399-// 以下ラッパー
400-// 戻り値バッファ r
401-// ワイド文字バッファ pw%d
402-// マルチバイト文字バッファ pm%d
403-// 引数バッファ a%d
404-
405-#pragma warning(disable:4102)
406-#define START_ROUTINE do{
407-#define END_ROUTINE }while(0);end_of_routine:
408-#define QUIT_ROUTINE goto end_of_routine;
409-
410-int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
411-{
412- int r = 0;
413- char* pm0 = NULL;
414-START_ROUTINE
415- pm0 = DuplicateWtoM(lpCmdLine, -1);
416- r = WinMainM(hInstance, hPrevInstance, pm0, nCmdShow);
417-END_ROUTINE
418- FreeDuplicatedString(pm0);
419- return r;
420-}
421-
422-HMODULE LoadLibraryM(LPCSTR lpLibFileName)
423-{
424- HMODULE r = NULL;
425- wchar_t* pw0 = NULL;
426-START_ROUTINE
427- pw0 = DuplicateMtoW(lpLibFileName, -1);
428- r = LoadLibraryW(pw0);
429-END_ROUTINE
430- FreeDuplicatedString(pw0);
431- return r;
432-}
433-
434-HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
435-{
436- HANDLE r = INVALID_HANDLE_VALUE;
437- wchar_t* pw0 = NULL;
438-START_ROUTINE
439- pw0 = DuplicateMtoW(lpFileName, -1);
440- r = CreateFileW(pw0, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
441-END_ROUTINE
442- FreeDuplicatedString(pw0);
443- return r;
444-}
445-
446-int MessageBoxM(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
447-{
448- int r = IDOK;
449- wchar_t* pw0 = NULL;
450- wchar_t* pw1 = NULL;
451-START_ROUTINE
452- pw0 = DuplicateMtoW(lpText, -1);
453- pw1 = DuplicateMtoW(lpCaption, -1);
454- r = MessageBoxW(hWnd, pw0, pw1, uType);
455-END_ROUTINE
456- FreeDuplicatedString(pw0);
457- FreeDuplicatedString(pw1);
458- return r;
459-}
460-
461-HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
462-{
463- HANDLE r = INVALID_HANDLE_VALUE;
464- wchar_t* pw0 = NULL;
465- WIN32_FIND_DATAW a0;
466-START_ROUTINE
467- pw0 = DuplicateMtoW(lpFileName, -1);
468- r = FindFirstFileW(pw0, &a0);
469- if(r != INVALID_HANDLE_VALUE)
470- {
471- lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
472- lpFindFileData->ftCreationTime = a0.ftCreationTime;
473- lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
474- lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
475- lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
476- lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
477- lpFindFileData->dwReserved0 = a0.dwReserved0;
478- lpFindFileData->dwReserved1 = a0.dwReserved1;
479- WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
480- WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
481- }
482-END_ROUTINE
483- FreeDuplicatedString(pw0);
484- return r;
485-}
486-
487-BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
488-{
489- BOOL r = FALSE;
490- WIN32_FIND_DATAW a0;
491-START_ROUTINE
492- r = FindNextFileW(hFindFile, &a0);
493- if(r)
494- {
495- lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
496- lpFindFileData->ftCreationTime = a0.ftCreationTime;
497- lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
498- lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
499- lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
500- lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
501- lpFindFileData->dwReserved0 = a0.dwReserved0;
502- lpFindFileData->dwReserved1 = a0.dwReserved1;
503- WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
504- WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
505- }
506-END_ROUTINE
507- return r;
508-}
509-
510-DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer)
511-{
512- DWORD r = 0;
513- wchar_t* pw0 = NULL;
514-START_ROUTINE
515- pw0 = AllocateStringW(nBufferLength * 4);
516- GetLogicalDriveStringsW(nBufferLength * 4, pw0);
517- WtoMMultiString(lpBuffer, nBufferLength, pw0);
518- r = TerminateStringM(lpBuffer, nBufferLength);
519-END_ROUTINE
520- FreeDuplicatedString(pw0);
521- return r;
522-}
523-
524-ATOM RegisterClassExM(CONST WNDCLASSEXA * v0)
525-{
526- ATOM r = 0;
527-START_ROUTINE
528- // WNDPROCがShift_JIS用であるため
529- r = RegisterClassExA(v0);
530-END_ROUTINE
531- return r;
532-}
533-
534-HWND CreateWindowExM(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
535-{
536- HWND r = NULL;
537- wchar_t* pw0 = NULL;
538- wchar_t* pw1 = NULL;
539-START_ROUTINE
540- pw0 = DuplicateMtoW(lpClassName, -1);
541- pw1 = DuplicateMtoW(lpWindowName, -1);
542- r = CreateWindowExW(dwExStyle, pw0, pw1, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
543-END_ROUTINE
544- FreeDuplicatedString(pw0);
545- FreeDuplicatedString(pw1);
546- return r;
547-}
548-
549-LONG GetWindowLongM(HWND hWnd, int nIndex)
550-{
551- LRESULT r = 0;
552-START_ROUTINE
553- // WNDPROCがShift_JIS用であるため
554- if(IsWindowUnicode(hWnd))
555- r = GetWindowLongW(hWnd, nIndex);
556- else
557- r = GetWindowLongA(hWnd, nIndex);
558-END_ROUTINE
559- return r;
560-}
561-
562-LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong)
563-{
564- LRESULT r = 0;
565-START_ROUTINE
566- // WNDPROCがShift_JIS用であるため
567- if(IsWindowUnicode(hWnd))
568- r = SetWindowLongW(hWnd, nIndex, dwNewLong);
569- else
570- r = SetWindowLongA(hWnd, nIndex, dwNewLong);
571-END_ROUTINE
572- return r;
573-}
574-
575-LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
576-{
577- LRESULT r = 0;
578-START_ROUTINE
579- // WNDPROCがShift_JIS用であるため
580- if(IsWindowUnicode(hWnd))
581- r = DefWindowProcW(hWnd, Msg, wParam, lParam);
582- else
583- r = DefWindowProcA(hWnd, Msg, wParam, lParam);
584-END_ROUTINE
585- return r;
586-}
587-
588-LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
589-{
590- LRESULT r = 0;
591-START_ROUTINE
592- // WNDPROCがShift_JIS用であるため
593- if(IsWindowUnicode(hWnd))
594- r = CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
595- else
596- r = CallWindowProcA(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
597-END_ROUTINE
598- return r;
599-}
600-
601-LRESULT SendMessageM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
602-{
603- LRESULT r = 0;
604- wchar_t* pw0 = NULL;
605- wchar_t* pw1 = NULL;
606- int Size;
607- LVITEMA* pmLVItem;
608- LVITEMW wLVItem;
609- LVFINDINFOA* pmLVFindInfo;
610- LVFINDINFOW wLVFindInfo;
611- LVCOLUMNA* pmLVColumn;
612- LVCOLUMNW wLVColumn;
613- TVITEMEXA* pmTVItem;
614- TVITEMEXW wTVItem;
615- TVINSERTSTRUCTA* pmTVInsert;
616- TVINSERTSTRUCTW wTVInsert;
617- wchar_t ClassName[MAX_PATH];
618-START_ROUTINE
619- switch(Msg)
620- {
621- case WM_SETTEXT:
622- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
623- r = SendMessageW(hWnd, WM_SETTEXT, wParam, (LPARAM)pw0);
624- break;
625- case WM_GETTEXT:
626- pw0 = AllocateStringW(wParam * 4);
627- SendMessageW(hWnd, WM_GETTEXT, wParam * 4, (LPARAM)pw0);
628- WtoM((LPSTR)lParam, wParam, pw0, -1);
629- r = TerminateStringM((LPSTR)lParam, wParam);
630- break;
631- case WM_GETTEXTLENGTH:
632- Size = SendMessageW(hWnd, WM_GETTEXTLENGTH, wParam, lParam) + 1;
633- pw0 = AllocateStringW(Size);
634- SendMessageW(hWnd, WM_GETTEXT, (WPARAM)Size, (LPARAM)pw0);
635- r = WtoM(NULL, 0, pw0, -1) - 1;
636- break;
637- default:
638- GetClassNameW(hWnd, ClassName, sizeof(ClassName) / sizeof(wchar_t));
639- if(_wcsicmp(ClassName, WC_EDITW) == 0)
640- {
641- switch(Msg)
642- {
643- case EM_REPLACESEL:
644- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
645- r = SendMessageW(hWnd, EM_REPLACESEL, wParam, (LPARAM)pw0);
646- break;
647- default:
648- r = SendMessageW(hWnd, Msg, wParam, lParam);
649- break;
650- }
651- }
652- else if(_wcsicmp(ClassName, WC_COMBOBOXW) == 0)
653- {
654- switch(Msg)
655- {
656- case CB_ADDSTRING:
657- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
658- r = SendMessageW(hWnd, CB_ADDSTRING, wParam, (LPARAM)pw0);
659- break;
660- case CB_GETLBTEXT:
661- Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
662- pw0 = AllocateStringW(Size);
663- SendMessageW(hWnd, CB_GETLBTEXT, wParam, (LPARAM)pw0);
664- // バッファ長不明のためオーバーランの可能性あり
665- WtoM((LPSTR)lParam, Size * 4, pw0, -1);
666- r = TerminateStringM((LPSTR)lParam, Size * 4);
667- break;
668- case CB_GETLBTEXTLEN:
669- Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
670- pw0 = AllocateStringW(Size);
671- SendMessageW(hWnd, WM_GETTEXT, wParam, (LPARAM)pw0);
672- r = WtoM(NULL, 0, pw0, -1) - 1;
673- break;
674- case CB_INSERTSTRING:
675- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
676- r = SendMessageW(hWnd, CB_INSERTSTRING, wParam, (LPARAM)pw0);
677- break;
678- case CB_FINDSTRINGEXACT:
679- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
680- r = SendMessageW(hWnd, CB_FINDSTRINGEXACT, wParam, (LPARAM)pw0);
681- break;
682- default:
683- r = SendMessageW(hWnd, Msg, wParam, lParam);
684- break;
685- }
686- }
687- else if(_wcsicmp(ClassName, WC_LISTBOXW) == 0)
688- {
689- switch(Msg)
690- {
691- case LB_ADDSTRING:
692- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
693- r = SendMessageW(hWnd, LB_ADDSTRING, wParam, (LPARAM)pw0);
694- break;
695- case LB_INSERTSTRING:
696- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
697- r = SendMessageW(hWnd, LB_INSERTSTRING, wParam, (LPARAM)pw0);
698- break;
699- case LB_GETTEXT:
700- Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
701- pw0 = AllocateStringW(Size);
702- SendMessageW(hWnd, LB_GETTEXT, wParam, (LPARAM)pw0);
703- // バッファ長不明のためオーバーランの可能性あり
704- WtoM((LPSTR)lParam, Size * 4, pw0, -1);
705- r = TerminateStringM((LPSTR)lParam, Size * 4);
706- break;
707- case LB_GETTEXTLEN:
708- Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
709- pw0 = AllocateStringW(Size);
710- SendMessageW(hWnd, WM_GETTEXT, wParam, (LPARAM)pw0);
711- r = WtoM(NULL, 0, pw0, -1) - 1;
712- break;
713- default:
714- r = SendMessageW(hWnd, Msg, wParam, lParam);
715- break;
716- }
717- }
718- else if(_wcsicmp(ClassName, WC_LISTVIEWW) == 0)
719- {
720- switch(Msg)
721- {
722- case LVM_GETITEMA:
723- pmLVItem = (LVITEMA*)lParam;
724- wLVItem.mask = pmLVItem->mask;
725- wLVItem.iItem = pmLVItem->iItem;
726- wLVItem.iSubItem = pmLVItem->iSubItem;
727- wLVItem.state = pmLVItem->state;
728- wLVItem.stateMask = pmLVItem->stateMask;
729- if(pmLVItem->mask & LVIF_TEXT)
730- {
731- Size = pmLVItem->cchTextMax * 4;
732- pw0 = AllocateStringW(Size);
733- wLVItem.pszText = pw0;
734- wLVItem.cchTextMax = Size;
735- }
736- wLVItem.iImage = pmLVItem->iImage;
737- wLVItem.lParam = pmLVItem->lParam;
738- wLVItem.iIndent = pmLVItem->iIndent;
739- r = SendMessageW(hWnd, LVM_GETITEMW, wParam, (LPARAM)&wLVItem);
740- pmLVItem->mask = wLVItem.mask;
741- pmLVItem->iItem = wLVItem.iItem;
742- pmLVItem->iSubItem = wLVItem.iSubItem;
743- pmLVItem->state = wLVItem.state;
744- pmLVItem->stateMask = wLVItem.stateMask;
745- if(pmLVItem->mask & LVIF_TEXT)
746- {
747- WtoM(pmLVItem->pszText, pmLVItem->cchTextMax, wLVItem.pszText, -1);
748- TerminateStringM(pmLVItem->pszText, pmLVItem->cchTextMax);
749- }
750- pmLVItem->iImage = wLVItem.iImage;
751- pmLVItem->lParam = wLVItem.lParam;
752- pmLVItem->iIndent = wLVItem.iIndent;
753- break;
754- case LVM_SETITEMA:
755- pmLVItem = (LVITEMA*)lParam;
756- wLVItem.mask = pmLVItem->mask;
757- wLVItem.iItem = pmLVItem->iItem;
758- wLVItem.iSubItem = pmLVItem->iSubItem;
759- wLVItem.state = pmLVItem->state;
760- wLVItem.stateMask = pmLVItem->stateMask;
761- if(pmLVItem->mask & LVIF_TEXT)
762- {
763- pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
764- wLVItem.pszText = pw0;
765- // TODO: cchTextMaxの確認
766- wLVItem.cchTextMax = pmLVItem->cchTextMax;
767- }
768- wLVItem.iImage = pmLVItem->iImage;
769- wLVItem.lParam = pmLVItem->lParam;
770- wLVItem.iIndent = pmLVItem->iIndent;
771- r = SendMessageW(hWnd, LVM_SETITEMW, wParam, (LPARAM)&wLVItem);
772- break;
773- case LVM_INSERTITEMA:
774- pmLVItem = (LVITEMA*)lParam;
775- wLVItem.mask = pmLVItem->mask;
776- wLVItem.iItem = pmLVItem->iItem;
777- wLVItem.iSubItem = pmLVItem->iSubItem;
778- wLVItem.state = pmLVItem->state;
779- wLVItem.stateMask = pmLVItem->stateMask;
780- if(pmLVItem->mask & LVIF_TEXT)
781- {
782- pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
783- wLVItem.pszText = pw0;
784- // TODO: cchTextMaxの確認
785- wLVItem.cchTextMax = pmLVItem->cchTextMax;
786- }
787- wLVItem.iImage = pmLVItem->iImage;
788- wLVItem.lParam = pmLVItem->lParam;
789- wLVItem.iIndent = pmLVItem->iIndent;
790- r = SendMessageW(hWnd, LVM_INSERTITEMW, wParam, (LPARAM)&wLVItem);
791- break;
792- case LVM_FINDITEMA:
793- pmLVFindInfo = (LVFINDINFOA*)lParam;
794- wLVFindInfo.flags = pmLVFindInfo->flags;
795- if(pmLVFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL))
796- {
797- pw0 = DuplicateMtoW(pmLVFindInfo->psz, -1);
798- wLVFindInfo.psz = pw0;
799- }
800- wLVFindInfo.lParam = pmLVFindInfo->lParam;
801- wLVFindInfo.pt = pmLVFindInfo->pt;
802- wLVFindInfo.vkDirection = pmLVFindInfo->vkDirection;
803- r = SendMessageW(hWnd, LVM_FINDITEMW, wParam, (LPARAM)&wLVItem);
804- break;
805- case LVM_GETCOLUMNA:
806- pmLVColumn = (LVCOLUMNA*)lParam;
807- wLVColumn.mask = pmLVColumn->mask;
808- wLVColumn.fmt = pmLVColumn->fmt;
809- wLVColumn.cx = pmLVColumn->cx;
810- Size = pmLVColumn->cchTextMax * 4;
811- if(pmLVColumn->mask & LVCF_TEXT)
812- {
813- pw0 = AllocateStringW(Size);
814- wLVColumn.pszText = pw0;
815- wLVColumn.cchTextMax = Size;
816- }
817- wLVColumn.iSubItem = pmLVColumn->iSubItem;
818- wLVColumn.iImage = pmLVColumn->iImage;
819- wLVColumn.iOrder = pmLVColumn->iOrder;
820- r = SendMessageW(hWnd, LVM_GETCOLUMNW, wParam, (LPARAM)&wLVColumn);
821- pmLVColumn->mask = wLVColumn.mask;
822- pmLVColumn->fmt = wLVColumn.fmt;
823- pmLVColumn->cx = wLVColumn.cx;
824- if(pmLVColumn->mask & LVCF_TEXT)
825- {
826- WtoM(pmLVColumn->pszText, pmLVColumn->cchTextMax, wLVColumn.pszText, -1);
827- TerminateStringM(pmLVColumn->pszText, pmLVColumn->cchTextMax);
828- }
829- pmLVColumn->iSubItem = wLVColumn.iSubItem;
830- pmLVColumn->iImage = wLVColumn.iImage;
831- pmLVColumn->iOrder = wLVColumn.iOrder;
832- break;
833- case LVM_INSERTCOLUMNA:
834- pmLVColumn = (LVCOLUMNA*)lParam;
835- wLVColumn.mask = pmLVColumn->mask;
836- wLVColumn.fmt = pmLVColumn->fmt;
837- wLVColumn.cx = pmLVColumn->cx;
838- if(pmLVColumn->mask & LVCF_TEXT)
839- {
840- pw0 = DuplicateMtoW(pmLVColumn->pszText, -1);
841- wLVColumn.pszText = pw0;
842- // TODO: cchTextMaxの確認
843- wLVColumn.cchTextMax = pmLVColumn->cchTextMax;
844- }
845- wLVColumn.iSubItem = pmLVColumn->iSubItem;
846- wLVColumn.iImage = pmLVColumn->iImage;
847- wLVColumn.iOrder = pmLVColumn->iOrder;
848- r = SendMessageW(hWnd, LVM_INSERTCOLUMNW, wParam, (LPARAM)&wLVColumn);
849- break;
850- case LVM_GETITEMTEXTA:
851- pmLVItem = (LVITEMA*)lParam;
852- wLVItem.mask = pmLVItem->mask;
853- wLVItem.iItem = pmLVItem->iItem;
854- wLVItem.iSubItem = pmLVItem->iSubItem;
855- wLVItem.state = pmLVItem->state;
856- wLVItem.stateMask = pmLVItem->stateMask;
857- Size = pmLVItem->cchTextMax * 4;
858- pw0 = AllocateStringW(Size);
859- wLVItem.pszText = pw0;
860- wLVItem.cchTextMax = Size;
861- wLVItem.iImage = pmLVItem->iImage;
862- wLVItem.lParam = pmLVItem->lParam;
863- wLVItem.iIndent = pmLVItem->iIndent;
864- r = SendMessageW(hWnd, LVM_GETITEMTEXTW, wParam, (LPARAM)&wLVItem);
865- pmLVItem->mask = wLVItem.mask;
866- pmLVItem->iItem = wLVItem.iItem;
867- pmLVItem->iSubItem = wLVItem.iSubItem;
868- pmLVItem->state = wLVItem.state;
869- pmLVItem->stateMask = wLVItem.stateMask;
870- WtoM(pmLVItem->pszText, pmLVItem->cchTextMax, wLVItem.pszText, -1);
871- TerminateStringM(pmLVItem->pszText, pmLVItem->cchTextMax);
872- pmLVItem->iImage = wLVItem.iImage;
873- pmLVItem->lParam = wLVItem.lParam;
874- pmLVItem->iIndent = wLVItem.iIndent;
875- break;
876- default:
877- r = SendMessageW(hWnd, Msg, wParam, lParam);
878- break;
879- }
880- }
881- else if(_wcsicmp(ClassName, STATUSCLASSNAMEW) == 0)
882- {
883- switch(Msg)
884- {
885- case SB_SETTEXTA:
886- pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
887- r = SendMessageW(hWnd, SB_SETTEXTW, wParam, (LPARAM)pw0);
888- break;
889- default:
890- r = SendMessageW(hWnd, Msg, wParam, lParam);
891- break;
892- }
893- }
894- else if(_wcsicmp(ClassName, WC_TREEVIEWW) == 0)
895- {
896- switch(Msg)
897- {
898- case TVM_GETITEMA:
899- pmTVItem = (TVITEMEXA*)lParam;
900- wTVItem.mask = pmTVItem->mask;
901- wTVItem.hItem = pmTVItem->hItem;
902- wTVItem.state = pmTVItem->state;
903- wTVItem.stateMask = pmTVItem->stateMask;
904- if(pmTVItem->mask & TVIF_TEXT)
905- {
906- Size = pmTVItem->cchTextMax * 4;
907- pw0 = AllocateStringW(Size);
908- wTVItem.pszText = pw0;
909- wTVItem.cchTextMax = Size;
910- }
911- wTVItem.iImage = pmTVItem->iImage;
912- wTVItem.iSelectedImage = pmTVItem->iSelectedImage;
913- wTVItem.cChildren = pmTVItem->cChildren;
914- wTVItem.lParam = pmTVItem->lParam;
915- wTVItem.iIntegral = pmTVItem->iIntegral;
916-// wTVItem.uStateEx = pmTVItem->uStateEx;
917-// wTVItem.hwnd = pmTVItem->hwnd;
918-// wTVItem.iExpandedImage = pmTVItem->iExpandedImage;
919-// wTVItem.iReserved = pmTVItem->iReserved;
920- r = SendMessageW(hWnd, TVM_GETITEMW, wParam, (LPARAM)&wTVItem);
921- pmTVItem->mask = wTVItem.mask;
922- pmTVItem->hItem = wTVItem.hItem;
923- pmTVItem->state = wTVItem.state;
924- pmTVItem->stateMask = wTVItem.stateMask;
925- if(pmTVItem->mask & TVIF_TEXT)
926- {
927- WtoM(pmTVItem->pszText, pmTVItem->cchTextMax, wTVItem.pszText, -1);
928- TerminateStringM(pmTVItem->pszText, pmTVItem->cchTextMax);
929- }
930- pmTVItem->iImage = wTVItem.iImage;
931- pmTVItem->iSelectedImage = wTVItem.iSelectedImage;
932- pmTVItem->cChildren = wTVItem.cChildren;
933- pmTVItem->lParam = wTVItem.lParam;
934- pmTVItem->iIntegral = wTVItem.iIntegral;
935-// pmTVItem->uStateEx = wTVItem.uStateEx;
936-// pmTVItem->hwnd = wTVItem.hwnd;
937-// pmTVItem->iExpandedImage = wTVItem.iExpandedImage;
938-// pmTVItem->iReserved = wTVItem.iReserved;
939- break;
940- case TVM_INSERTITEMA:
941- pmTVInsert = (TVINSERTSTRUCTA*)lParam;
942- wTVInsert.hParent = pmTVInsert->hParent;
943- wTVInsert.hInsertAfter = pmTVInsert->hInsertAfter;
944- wTVInsert.itemex.mask = pmTVInsert->itemex.mask;
945- wTVInsert.itemex.hItem = pmTVInsert->itemex.hItem;
946- wTVInsert.itemex.state = pmTVInsert->itemex.state;
947- wTVInsert.itemex.stateMask = pmTVInsert->itemex.stateMask;
948- if(pmTVInsert->itemex.mask & TVIF_TEXT)
949- {
950- pw0 = DuplicateMtoW(pmTVInsert->itemex.pszText, -1);
951- wTVInsert.itemex.pszText = pw0;
952- // TODO: cchTextMaxの確認
953- wTVInsert.itemex.cchTextMax = pmTVInsert->itemex.cchTextMax;
954- }
955- wTVInsert.itemex.iImage = pmTVInsert->itemex.iImage;
956- wTVInsert.itemex.iSelectedImage = pmTVInsert->itemex.iSelectedImage;
957- wTVInsert.itemex.cChildren = pmTVInsert->itemex.cChildren;
958- wTVInsert.itemex.lParam = pmTVInsert->itemex.lParam;
959- wTVInsert.itemex.iIntegral = pmTVInsert->itemex.iIntegral;
960-// wTVInsert.itemex.uStateEx = pmTVInsert->itemex.uStateEx;
961-// wTVInsert.itemex.hwnd = pmTVInsert->itemex.hwnd;
962-// wTVInsert.itemex.iExpandedImage = pmTVInsert->itemex.iExpandedImage;
963-// wTVInsert.itemex.iReserved = pmTVInsert->itemex.iReserved;
964- r = SendMessageW(hWnd, TVM_INSERTITEMW, wParam, (LPARAM)&wTVInsert);
965- break;
966- default:
967- r = SendMessageW(hWnd, Msg, wParam, lParam);
968- break;
969- }
970- }
971- else
972- r = SendMessageW(hWnd, Msg, wParam, lParam);
973- break;
974- }
975-END_ROUTINE
976- FreeDuplicatedString(pw0);
977- FreeDuplicatedString(pw1);
978- return r;
979-}
980-
981-LRESULT DefDlgProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
982-{
983- LRESULT r = 0;
984-START_ROUTINE
985- // WNDPROCがShift_JIS用であるため
986- if(IsWindowUnicode(hWnd))
987- r = DefDlgProcW(hWnd, Msg, wParam, lParam);
988- else
989- r = DefDlgProcA(hWnd, Msg, wParam, lParam);
990-END_ROUTINE
991- return r;
992-}
993-
994-LRESULT SendDlgItemMessageM(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam)
995-{
996- LRESULT r = 0;
997-START_ROUTINE
998- r = SendMessageM(GetDlgItem(hDlg, nIDDlgItem), Msg, wParam, lParam);
999-END_ROUTINE
1000- return r;
1001-}
1002-
1003-BOOL SetWindowTextM(HWND hWnd, LPCSTR lpString)
1004-{
1005- BOOL r = FALSE;
1006- wchar_t* pw0 = NULL;
1007-START_ROUTINE
1008- pw0 = DuplicateMtoW(lpString, -1);
1009- r = SetWindowTextW(hWnd, pw0);
1010-END_ROUTINE
1011- FreeDuplicatedString(pw0);
1012- return r;
1013-}
1014-
1015-UINT DragQueryFileM(HDROP hDrop, UINT iFile, LPSTR lpszFile, UINT cch)
1016-{
1017- UINT r = 0;
1018- wchar_t* pw0 = NULL;
1019-START_ROUTINE
1020- if(iFile == (UINT)-1)
1021- r = DragQueryFileW(hDrop, iFile, (LPWSTR)lpszFile, cch);
1022- else
1023- {
1024- pw0 = AllocateStringW(cch * 4);
1025- DragQueryFileW(hDrop, iFile, pw0, cch * 4);
1026- WtoM(lpszFile, cch, pw0, -1);
1027- r = TerminateStringM(lpszFile, cch);
1028- }
1029-END_ROUTINE
1030- FreeDuplicatedString(pw0);
1031- return r;
1032-}
1033-
1034-LPSTR GetCommandLineM()
1035-{
1036- LPSTR r = 0;
1037- static char* pm0 = NULL;
1038-START_ROUTINE
1039- if(!pm0)
1040- pm0 = DuplicateWtoM(GetCommandLineW(), -1);
1041- r = pm0;
1042-END_ROUTINE
1043- return r;
1044-}
1045-
1046-DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer)
1047-{
1048- DWORD r = 0;
1049- wchar_t* pw0 = NULL;
1050-START_ROUTINE
1051- // TODO: バッファが不十分な場合に必要なサイズを返す
1052- pw0 = AllocateStringW(nBufferLength * 4);
1053- GetCurrentDirectoryW(nBufferLength * 4, pw0);
1054- WtoM(lpBuffer, nBufferLength, pw0, -1);
1055- r = TerminateStringM(lpBuffer, nBufferLength);
1056-END_ROUTINE
1057- FreeDuplicatedString(pw0);
1058- return r;
1059-}
1060-
1061-BOOL SetCurrentDirectoryM(LPCSTR lpPathName)
1062-{
1063- BOOL r = FALSE;
1064- wchar_t* pw0 = NULL;
1065-START_ROUTINE
1066- pw0 = DuplicateMtoW(lpPathName, -1);
1067- r = SetCurrentDirectoryW(pw0);
1068-END_ROUTINE
1069- FreeDuplicatedString(pw0);
1070- return r;
1071-}
1072-
1073-DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer)
1074-{
1075- DWORD r = 0;
1076- wchar_t* pw0 = NULL;
1077-START_ROUTINE
1078- pw0 = AllocateStringW(nBufferLength * 4);
1079- GetTempPathW(nBufferLength * 4, pw0);
1080- WtoM(lpBuffer, nBufferLength, pw0, -1);
1081- r = TerminateStringM(lpBuffer, nBufferLength);
1082-END_ROUTINE
1083- FreeDuplicatedString(pw0);
1084- return r;
1085-}
1086-
1087-DWORD GetFileAttributesM(LPCSTR lpFileName)
1088-{
1089- DWORD r = FALSE;
1090- wchar_t* pw0 = NULL;
1091-START_ROUTINE
1092- pw0 = DuplicateMtoW(lpFileName, -1);
1093- r = GetFileAttributesW(pw0);
1094-END_ROUTINE
1095- FreeDuplicatedString(pw0);
1096- return r;
1097-}
1098-
1099-DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize)
1100-{
1101- DWORD r = 0;
1102- wchar_t* pw0 = NULL;
1103-START_ROUTINE
1104- pw0 = AllocateStringW(nSize * 4);
1105- GetModuleFileNameW(hModule, pw0, nSize * 4);
1106- WtoM(lpFilename, nSize, pw0, -1);
1107- r = TerminateStringM(lpFilename, nSize);
1108-END_ROUTINE
1109- FreeDuplicatedString(pw0);
1110- return r;
1111-}
1112-
1113-LSTATUS RegOpenKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
1114-{
1115- LSTATUS r = 0;
1116- wchar_t* pw0 = NULL;
1117-START_ROUTINE
1118- pw0 = DuplicateMtoW(lpSubKey, -1);
1119- r = RegOpenKeyExW(hKey, pw0, ulOptions, samDesired, phkResult);
1120-END_ROUTINE
1121- FreeDuplicatedString(pw0);
1122- return r;
1123-}
1124-
1125-LSTATUS RegCreateKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition)
1126-{
1127- LSTATUS r = 0;
1128- wchar_t* pw0 = NULL;
1129- wchar_t* pw1 = NULL;
1130-START_ROUTINE
1131- pw0 = DuplicateMtoW(lpSubKey, -1);
1132- pw1 = DuplicateMtoW(lpClass, -1);
1133- r = RegCreateKeyExW(hKey, pw0, Reserved, pw1, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
1134-END_ROUTINE
1135- FreeDuplicatedString(pw0);
1136- FreeDuplicatedString(pw1);
1137- return r;
1138-}
1139-
1140-LSTATUS RegDeleteValueM(HKEY hKey, LPCSTR lpValueName)
1141-{
1142- LSTATUS r = 0;
1143- wchar_t* pw0 = NULL;
1144-START_ROUTINE
1145- pw0 = DuplicateMtoW(lpValueName, -1);
1146- r = RegDeleteValueW(hKey, pw0);
1147-END_ROUTINE
1148- FreeDuplicatedString(pw0);
1149- return r;
1150-}
1151-
1152-LSTATUS RegQueryValueExM(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
1153-{
1154- LSTATUS r = 0;
1155- wchar_t* pw0 = NULL;
1156- wchar_t* pw1 = NULL;
1157- DWORD dwType;
1158- DWORD wcbData;
1159-START_ROUTINE
1160- pw0 = DuplicateMtoW(lpValueName, -1);
1161- if(RegQueryValueExW(hKey, pw0, NULL, &dwType, NULL, 0) == ERROR_SUCCESS)
1162- {
1163- switch(dwType)
1164- {
1165- case REG_SZ:
1166- case REG_EXPAND_SZ:
1167- case REG_MULTI_SZ:
1168- if(lpcbData)
1169- {
1170- pw1 = AllocateStringW(*lpcbData / sizeof(char) * 4);
1171- wcbData = *lpcbData / sizeof(char) * 4;
1172- r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, (LPBYTE)pw1, &wcbData);
1173- if(lpData)
1174- *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t));
1175- else
1176- *lpcbData = sizeof(char) * WtoM(NULL, 0, pw1, wcbData / sizeof(wchar_t));
1177- }
1178- break;
1179- default:
1180- r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, lpData, lpcbData);
1181- break;
1182- }
1183- }
1184- else
1185- r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, lpData, lpcbData);
1186-END_ROUTINE
1187- FreeDuplicatedString(pw0);
1188- FreeDuplicatedString(pw1);
1189- return r;
1190-}
1191-
1192-LSTATUS RegSetValueExM(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData)
1193-{
1194- LSTATUS r = 0;
1195- wchar_t* pw0 = NULL;
1196- wchar_t* pw1 = NULL;
1197- DWORD wcbData;
1198-START_ROUTINE
1199- pw0 = DuplicateMtoW(lpValueName, -1);
1200- switch(dwType)
1201- {
1202- case REG_SZ:
1203- case REG_EXPAND_SZ:
1204- case REG_MULTI_SZ:
1205- wcbData = MtoW(NULL, 0, (char*)lpData, cbData / sizeof(char));
1206- pw1 = AllocateStringW(wcbData);
1207- MtoW(pw1, wcbData, (char*)lpData, cbData / sizeof(char));
1208- wcbData = sizeof(wchar_t) * wcbData;
1209- lpData = (BYTE*)pw1;
1210- cbData = wcbData;
1211- break;
1212- }
1213- r = RegSetValueExW(hKey, pw0, Reserved, dwType, lpData, cbData);
1214-END_ROUTINE
1215- FreeDuplicatedString(pw0);
1216- FreeDuplicatedString(pw1);
1217- return r;
1218-}
1219-
1220-BOOL TextOutM(HDC hdc, int x, int y, LPCSTR lpString, int c)
1221-{
1222- BOOL r = FALSE;
1223- wchar_t* pw0 = NULL;
1224-START_ROUTINE
1225- pw0 = DuplicateMtoW(lpString, c);
1226- r = TextOutW(hdc, x, y, pw0, wcslen(pw0));
1227-END_ROUTINE
1228- FreeDuplicatedString(pw0);
1229- return r;
1230-}
1231-
1232-BOOL GetTextExtentPoint32M(HDC hdc, LPCSTR lpString, int c, LPSIZE psizl)
1233-{
1234- BOOL r = FALSE;
1235- wchar_t* pw0 = NULL;
1236-START_ROUTINE
1237- pw0 = DuplicateMtoW(lpString, c);
1238- r = GetTextExtentPoint32W(hdc, pw0, wcslen(pw0), psizl);
1239-END_ROUTINE
1240- FreeDuplicatedString(pw0);
1241- return r;
1242-}
1243-
1244-INT_PTR PropertySheetM(LPCPROPSHEETHEADERA v0)
1245-{
1246- INT_PTR r = 0;
1247- PROPSHEETHEADERW a0;
1248- PROPSHEETPAGEW* pwPage;
1249- UINT i;
1250-START_ROUTINE
1251- a0.dwSize = sizeof(PROPSHEETHEADERW);
1252- a0.dwFlags = v0->dwFlags;
1253- a0.hwndParent = v0->hwndParent;
1254- a0.hInstance = v0->hInstance;
1255- if(v0->dwFlags & PSH_USEICONID)
1256- a0.pszIcon = DuplicateMtoW(v0->pszIcon, -1);
1257- else
1258- a0.hIcon = v0->hIcon;
1259- a0.pszCaption = DuplicateMtoW(v0->pszCaption, -1);
1260- a0.nPages = v0->nPages;
1261- if(v0->dwFlags & PSH_USEPSTARTPAGE)
1262- a0.pStartPage = DuplicateMtoW(v0->pStartPage, -1);
1263- else
1264- a0.nStartPage = v0->nStartPage;
1265- if(v0->dwFlags & PSH_PROPSHEETPAGE)
1266- {
1267- if(v0->ppsp && (pwPage = (PROPSHEETPAGEW*)malloc(sizeof(PROPSHEETPAGEW) * v0->nPages)))
1268- {
1269- for(i = 0; i < v0->nPages; i++)
1270- {
1271- pwPage[i].dwSize = sizeof(PROPSHEETPAGEW);
1272- pwPage[i].dwFlags = v0->ppsp[i].dwFlags;
1273- pwPage[i].hInstance = v0->ppsp[i].hInstance;
1274- if(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT)
1275- pwPage[i].pResource = v0->ppsp[i].pResource;
1276- else
1277- pwPage[i].pszTemplate = DuplicateMtoW(v0->ppsp[i].pszTemplate, -1);
1278- if(v0->ppsp[i].dwFlags & PSP_USEICONID)
1279- pwPage[i].pszIcon = DuplicateMtoW(v0->ppsp[i].pszIcon, -1);
1280- else
1281- pwPage[i].hIcon = v0->ppsp[i].hIcon;
1282- if(v0->ppsp[i].dwFlags & PSP_USETITLE)
1283- pwPage[i].pszTitle = DuplicateMtoW(v0->ppsp[i].pszTitle, -1);
1284- pwPage[i].pfnDlgProc = v0->ppsp[i].pfnDlgProc;
1285- pwPage[i].lParam = v0->ppsp[i].lParam;
1286- // TODO: pfnCallback
1287- pwPage[i].pfnCallback = (LPFNPSPCALLBACKW)v0->ppsp[i].pfnCallback;
1288- pwPage[i].pcRefParent = v0->ppsp[i].pcRefParent;
1289- if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
1290- pwPage[i].pszHeaderTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderTitle, -1);
1291- if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
1292- pwPage[i].pszHeaderSubTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderSubTitle, -1);
1293- }
1294- }
1295- else
1296- pwPage = NULL;
1297- a0.ppsp = pwPage;
1298- }
1299- else
1300- a0.phpage = v0->phpage;
1301- a0.pfnCallback = v0->pfnCallback;
1302- if(v0->dwFlags & PSH_USEHBMWATERMARK)
1303- a0.hbmWatermark = v0->hbmWatermark;
1304- else
1305- a0.pszbmWatermark = DuplicateMtoW(v0->pszbmWatermark, -1);
1306- r = PropertySheetW(&a0);
1307- if(a0.dwFlags & PSH_USEICONID)
1308- FreeDuplicatedString((void*)a0.pszIcon);
1309- FreeDuplicatedString((void*)a0.pszCaption);
1310- if(v0->dwFlags & PSH_USEPSTARTPAGE)
1311- FreeDuplicatedString((void*)a0.pStartPage);
1312- if(v0->dwFlags & PSH_PROPSHEETPAGE)
1313- {
1314- if(pwPage)
1315- {
1316- for(i = 0; i < v0->nPages; i++)
1317- {
1318- if(!(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT))
1319- FreeDuplicatedString((void*)pwPage[i].pszTemplate);
1320- if(v0->ppsp[i].dwFlags & PSP_USEICONID)
1321- FreeDuplicatedString((void*)pwPage[i].pszIcon);
1322- if(v0->ppsp[i].dwFlags & PSP_USETITLE)
1323- FreeDuplicatedString((void*)pwPage[i].pszTitle);
1324- if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
1325- FreeDuplicatedString((void*)pwPage[i].pszHeaderTitle);
1326- if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
1327- FreeDuplicatedString((void*)pwPage[i].pszHeaderSubTitle);
1328- }
1329- free(pwPage);
1330- }
1331- }
1332- if(!(v0->dwFlags & PSH_USEHBMWATERMARK))
1333- FreeDuplicatedString((void*)a0.pszbmWatermark);
1334-END_ROUTINE
1335- return r;
1336-}
1337-
1338-BOOL GetOpenFileNameM(LPOPENFILENAMEA v0)
1339-{
1340- BOOL r = FALSE;
1341- wchar_t* pw0 = NULL;
1342- wchar_t* pw1 = NULL;
1343- wchar_t* pw2 = NULL;
1344- wchar_t* pw3 = NULL;
1345- wchar_t* pw4 = NULL;
1346- wchar_t* pw5 = NULL;
1347- wchar_t* pw6 = NULL;
1348- wchar_t* pw7 = NULL;
1349- wchar_t* pw8 = NULL;
1350- wchar_t* pw9 = NULL;
1351- OPENFILENAMEW wofn;
1352-START_ROUTINE
1353- wofn.lStructSize = sizeof(OPENFILENAMEW);
1354- wofn.hwndOwner = v0->hwndOwner;
1355- wofn.hInstance = v0->hInstance;
1356- pw0 = DuplicateMtoWMultiString(v0->lpstrFilter);
1357- wofn.lpstrFilter = pw0;
1358- pw1 = DuplicateMtoWBuffer(v0->lpstrCustomFilter, -1, v0->nMaxCustFilter * 4);
1359- wofn.lpstrCustomFilter = pw1;
1360- wofn.nMaxCustFilter = v0->nMaxCustFilter * 4;
1361- wofn.nFilterIndex = v0->nFilterIndex;
1362- pw2 = DuplicateMtoWMultiStringBuffer(v0->lpstrFile, v0->nMaxFile * 4);
1363- wofn.lpstrFile = pw2;
1364- wofn.nMaxFile = v0->nMaxFile * 4;
1365- pw3 = DuplicateMtoWBuffer(v0->lpstrFileTitle, -1, v0->nMaxFileTitle * 4);
1366- wofn.lpstrFileTitle = pw3;
1367- wofn.nMaxFileTitle = v0->nMaxFileTitle * 4;
1368- pw4 = DuplicateMtoW(v0->lpstrInitialDir, -1);
1369- wofn.lpstrInitialDir = pw4;
1370- pw5 = DuplicateMtoW(v0->lpstrTitle, -1);
1371- wofn.lpstrTitle = pw5;
1372- wofn.Flags = v0->Flags;
1373- wofn.nFileOffset = MtoW(NULL, 0, v0->lpstrFile, v0->nFileOffset);
1374- wofn.nFileExtension = MtoW(NULL, 0, v0->lpstrFile, v0->nFileExtension);
1375- pw6 = DuplicateMtoW(v0->lpstrDefExt, -1);
1376- wofn.lpstrDefExt = pw6;
1377- wofn.lCustData = v0->lCustData;
1378- wofn.lpfnHook = v0->lpfnHook;
1379- wofn.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);
1380- wofn.pvReserved = v0->pvReserved;
1381- wofn.FlagsEx = v0->FlagsEx;
1382- r = GetOpenFileNameW(&wofn);
1383- WtoM(v0->lpstrFile, v0->nMaxFile, wofn.lpstrFile, -1);
1384- TerminateStringM(v0->lpstrFile, v0->nMaxFile);
1385- v0->nFileOffset = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileOffset);
1386- v0->nFileExtension = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileExtension);
1387-END_ROUTINE
1388- FreeDuplicatedString(pw0);
1389- FreeDuplicatedString(pw1);
1390- FreeDuplicatedString(pw2);
1391- FreeDuplicatedString(pw3);
1392- FreeDuplicatedString(pw4);
1393- FreeDuplicatedString(pw5);
1394- FreeDuplicatedString(pw6);
1395- return r;
1396-}
1397-
1398-BOOL GetSaveFileNameM(LPOPENFILENAMEA v0)
1399-{
1400- BOOL r = FALSE;
1401- wchar_t* pw0 = NULL;
1402- wchar_t* pw1 = NULL;
1403- wchar_t* pw2 = NULL;
1404- wchar_t* pw3 = NULL;
1405- wchar_t* pw4 = NULL;
1406- wchar_t* pw5 = NULL;
1407- wchar_t* pw6 = NULL;
1408- wchar_t* pw7 = NULL;
1409- wchar_t* pw8 = NULL;
1410- wchar_t* pw9 = NULL;
1411- OPENFILENAMEW wofn;
1412-START_ROUTINE
1413- wofn.lStructSize = sizeof(OPENFILENAMEW);
1414- wofn.hwndOwner = v0->hwndOwner;
1415- wofn.hInstance = v0->hInstance;
1416- pw0 = DuplicateMtoWMultiString(v0->lpstrFilter);
1417- wofn.lpstrFilter = pw0;
1418- pw1 = DuplicateMtoWBuffer(v0->lpstrCustomFilter, -1, v0->nMaxCustFilter * 4);
1419- wofn.lpstrCustomFilter = pw1;
1420- wofn.nMaxCustFilter = v0->nMaxCustFilter * 4;
1421- wofn.nFilterIndex = v0->nFilterIndex;
1422- pw2 = DuplicateMtoWMultiStringBuffer(v0->lpstrFile, v0->nMaxFile * 4);
1423- wofn.lpstrFile = pw2;
1424- wofn.nMaxFile = v0->nMaxFile * 4;
1425- pw3 = DuplicateMtoWBuffer(v0->lpstrFileTitle, -1, v0->nMaxFileTitle * 4);
1426- wofn.lpstrFileTitle = pw3;
1427- wofn.nMaxFileTitle = v0->nMaxFileTitle * 4;
1428- pw4 = DuplicateMtoW(v0->lpstrInitialDir, -1);
1429- wofn.lpstrInitialDir = pw4;
1430- pw5 = DuplicateMtoW(v0->lpstrTitle, -1);
1431- wofn.lpstrTitle = pw5;
1432- wofn.Flags = v0->Flags;
1433- wofn.nFileOffset = MtoW(NULL, 0, v0->lpstrFile, v0->nFileOffset);
1434- wofn.nFileExtension = MtoW(NULL, 0, v0->lpstrFile, v0->nFileExtension);
1435- pw6 = DuplicateMtoW(v0->lpstrDefExt, -1);
1436- wofn.lpstrDefExt = pw6;
1437- wofn.lCustData = v0->lCustData;
1438- wofn.lpfnHook = v0->lpfnHook;
1439- wofn.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);
1440- wofn.pvReserved = v0->pvReserved;
1441- wofn.FlagsEx = v0->FlagsEx;
1442- r = GetSaveFileNameW(&wofn);
1443- WtoM(v0->lpstrFile, v0->nMaxFile, wofn.lpstrFile, -1);
1444- TerminateStringM(v0->lpstrFile, v0->nMaxFile);
1445- v0->nFileOffset = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileOffset);
1446- v0->nFileExtension = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileExtension);
1447-END_ROUTINE
1448- FreeDuplicatedString(pw0);
1449- FreeDuplicatedString(pw1);
1450- FreeDuplicatedString(pw2);
1451- FreeDuplicatedString(pw3);
1452- FreeDuplicatedString(pw4);
1453- FreeDuplicatedString(pw5);
1454- FreeDuplicatedString(pw6);
1455- return r;
1456-}
1457-
1458-HWND HtmlHelpM(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData)
1459-{
1460- HWND r = NULL;
1461- wchar_t* pw0 = NULL;
1462-START_ROUTINE
1463- pw0 = DuplicateMtoW(pszFile, -1);
1464- r = HtmlHelpW(hwndCaller, pw0, uCommand, dwData);
1465-END_ROUTINE
1466- FreeDuplicatedString(pw0);
1467- return r;
1468-}
1469-
1470-BOOL CreateProcessM(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
1471-{
1472- BOOL r = FALSE;
1473- wchar_t* pw0 = NULL;
1474- wchar_t* pw1 = NULL;
1475- wchar_t* pw2 = NULL;
1476- wchar_t* pw3 = NULL;
1477- wchar_t* pw4 = NULL;
1478- wchar_t* pw5 = NULL;
1479- STARTUPINFOW wStartupInfo;
1480-START_ROUTINE
1481- pw0 = DuplicateMtoW(lpApplicationName, -1);
1482- pw1 = DuplicateMtoWBuffer(lpCommandLine, -1, (strlen(lpCommandLine) + 1) * 4);
1483- pw2 = DuplicateMtoW(lpCurrentDirectory, -1);
1484- wStartupInfo.cb = sizeof(LPSTARTUPINFOW);
1485- pw3 = DuplicateMtoW(lpStartupInfo->lpReserved, -1);
1486- wStartupInfo.lpReserved = pw3;
1487- pw4 = DuplicateMtoW(lpStartupInfo->lpDesktop, -1);
1488- wStartupInfo.lpDesktop = pw4;
1489- pw5 = DuplicateMtoW(lpStartupInfo->lpTitle, -1);
1490- wStartupInfo.lpTitle = pw5;
1491- wStartupInfo.dwX = lpStartupInfo->dwX;
1492- wStartupInfo.dwY = lpStartupInfo->dwY;
1493- wStartupInfo.dwXSize = lpStartupInfo->dwXSize;
1494- wStartupInfo.dwYSize = lpStartupInfo->dwYSize;
1495- wStartupInfo.dwXCountChars = lpStartupInfo->dwXCountChars;
1496- wStartupInfo.dwYCountChars = lpStartupInfo->dwYCountChars;
1497- wStartupInfo.dwFillAttribute = lpStartupInfo->dwFillAttribute;
1498- wStartupInfo.dwFlags = lpStartupInfo->dwFlags;
1499- wStartupInfo.wShowWindow = lpStartupInfo->wShowWindow;
1500- wStartupInfo.cbReserved2 = lpStartupInfo->cbReserved2;
1501- wStartupInfo.lpReserved2 = lpStartupInfo->lpReserved2;
1502- wStartupInfo.hStdInput = lpStartupInfo->hStdInput;
1503- wStartupInfo.hStdOutput = lpStartupInfo->hStdOutput;
1504- wStartupInfo.hStdError = lpStartupInfo->hStdError;
1505- r = CreateProcessW(pw0, pw1, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, pw2, &wStartupInfo, lpProcessInformation);
1506- WtoM(lpCommandLine, strlen(lpCommandLine) + 1, pw1, -1);
1507-END_ROUTINE
1508- FreeDuplicatedString(pw0);
1509- FreeDuplicatedString(pw1);
1510- FreeDuplicatedString(pw2);
1511- FreeDuplicatedString(pw3);
1512- FreeDuplicatedString(pw4);
1513- FreeDuplicatedString(pw5);
1514- return r;
1515-}
1516-
1517-HINSTANCE FindExecutableM(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
1518-{
1519- HINSTANCE r = NULL;
1520- wchar_t* pw0 = NULL;
1521- wchar_t* pw1 = NULL;
1522- wchar_t* pw2 = NULL;
1523- wchar_t* pw3 = NULL;
1524-START_ROUTINE
1525- pw0 = DuplicateMtoW(lpFile, -1);
1526- pw1 = DuplicateMtoW(lpDirectory, -1);
1527- pw2 = AllocateStringW(MAX_PATH * 4);
1528- r = FindExecutableW(pw0, pw1, pw2);
1529- // バッファ長不明のためオーバーランの可能性あり
1530- WtoM(lpResult, MAX_PATH, pw2, -1);
1531- TerminateStringM(lpResult, MAX_PATH);
1532-END_ROUTINE
1533- FreeDuplicatedString(pw0);
1534- FreeDuplicatedString(pw1);
1535- FreeDuplicatedString(pw2);
1536- FreeDuplicatedString(pw3);
1537- return r;
1538-}
1539-
1540-HINSTANCE ShellExecuteM(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd)
1541-{
1542- HINSTANCE r = NULL;
1543- wchar_t* pw0 = NULL;
1544- wchar_t* pw1 = NULL;
1545- wchar_t* pw2 = NULL;
1546- wchar_t* pw3 = NULL;
1547-START_ROUTINE
1548- pw0 = DuplicateMtoW(lpOperation, -1);
1549- pw1 = DuplicateMtoW(lpFile, -1);
1550- pw2 = DuplicateMtoW(lpParameters, -1);
1551- pw3 = DuplicateMtoW(lpDirectory, -1);
1552- r = ShellExecuteW(hwnd, pw0, pw1, pw2, pw3, nShowCmd);
1553-END_ROUTINE
1554- FreeDuplicatedString(pw0);
1555- FreeDuplicatedString(pw1);
1556- FreeDuplicatedString(pw2);
1557- FreeDuplicatedString(pw3);
1558- return r;
1559-}
1560-
1561-PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi)
1562-{
1563- PIDLIST_ABSOLUTE r = NULL;
1564- wchar_t* pw0 = NULL;
1565- wchar_t* pw1 = NULL;
1566- BROWSEINFOW wbi;
1567-START_ROUTINE
1568- wbi.hwndOwner = lpbi->hwndOwner;
1569- wbi.pidlRoot = lpbi->pidlRoot;
1570- pw0 = DuplicateMtoWBuffer(lpbi->pszDisplayName, -1, MAX_PATH * 4);
1571- wbi.pszDisplayName = pw0;
1572- pw1 = DuplicateMtoW(lpbi->lpszTitle, -1);
1573- wbi.lpszTitle = pw1;
1574- wbi.ulFlags = lpbi->ulFlags;
1575- // TODO: lpfn
1576- wbi.lpfn = lpbi->lpfn;
1577- wbi.lParam = lpbi->lParam;
1578- wbi.iImage = lpbi->iImage;
1579- r = SHBrowseForFolderW(&wbi);
1580- // バッファ長不明のためオーバーランの可能性あり
1581- WtoM(lpbi->pszDisplayName, MAX_PATH, wbi.pszDisplayName, -1);
1582- lpbi->iImage = wbi.iImage;
1583-END_ROUTINE
1584- FreeDuplicatedString(pw0);
1585- FreeDuplicatedString(pw1);
1586- return r;
1587-}
1588-
1589-BOOL SHGetPathFromIDListM(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath)
1590-{
1591- BOOL r = FALSE;
1592- wchar_t* pw0 = NULL;
1593-START_ROUTINE
1594- pw0 = AllocateStringW(MAX_PATH * 4);
1595- r = SHGetPathFromIDListW(pidl, pw0);
1596- // バッファ長不明のためオーバーランの可能性あり
1597- WtoM(pszPath, MAX_PATH, pw0, -1);
1598- TerminateStringM(pszPath, MAX_PATH);
1599-END_ROUTINE
1600- FreeDuplicatedString(pw0);
1601- return r;
1602-}
1603-
1604-int SHFileOperationM(LPSHFILEOPSTRUCTA lpFileOp)
1605-{
1606- int r = 0;
1607- wchar_t* pw0 = NULL;
1608- wchar_t* pw1 = NULL;
1609- wchar_t* pw2 = NULL;
1610- SHFILEOPSTRUCTW wFileOp;
1611-START_ROUTINE
1612- wFileOp.hwnd = lpFileOp->hwnd;
1613- wFileOp.wFunc = lpFileOp->wFunc;
1614- pw0 = DuplicateMtoWMultiString(lpFileOp->pFrom);
1615- wFileOp.pFrom = pw0;
1616- pw1 = DuplicateMtoWMultiString(lpFileOp->pTo);
1617- wFileOp.pTo = pw1;
1618- wFileOp.fFlags = lpFileOp->fFlags;
1619- wFileOp.fAnyOperationsAborted = lpFileOp->fAnyOperationsAborted;
1620- wFileOp.hNameMappings = lpFileOp->hNameMappings;
1621- if(lpFileOp->fFlags & FOF_SIMPLEPROGRESS)
1622- pw2 = DuplicateMtoW(lpFileOp->lpszProgressTitle, -1);
1623- r = SHFileOperationW(&wFileOp);
1624- lpFileOp->fAnyOperationsAborted = wFileOp.fAnyOperationsAborted;
1625-END_ROUTINE
1626- FreeDuplicatedString(pw0);
1627- FreeDuplicatedString(pw1);
1628- FreeDuplicatedString(pw2);
1629- return r;
1630-}
1631-
1632-BOOL AppendMenuM(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem)
1633-{
1634- int r = 0;
1635- wchar_t* pw0 = NULL;
1636-START_ROUTINE
1637- if(uFlags & (MF_BITMAP | MF_OWNERDRAW))
1638- r = AppendMenuW(hMenu, uFlags, uIDNewItem, (LPCWSTR)lpNewItem);
1639- else
1640- {
1641- pw0 = DuplicateMtoW(lpNewItem, -1);
1642- r = AppendMenuW(hMenu, uFlags, uIDNewItem, pw0);
1643- }
1644-END_ROUTINE
1645- FreeDuplicatedString(pw0);
1646- return r;
1647-}
1648-
1649-BOOL GetMenuItemInfoM(HMENU hmenu, UINT item, BOOL fByPosition, LPMENUITEMINFOA lpmii)
1650-{
1651- BOOL r = FALSE;
1652- wchar_t* pw0 = NULL;
1653- MENUITEMINFOW wmii;
1654-START_ROUTINE
1655- wmii.cbSize = sizeof(MENUITEMINFOW);
1656- wmii.fMask = lpmii->fMask;
1657- wmii.fType = lpmii->fType;
1658- wmii.fState = lpmii->fState;
1659- wmii.wID = lpmii->wID;
1660- wmii.hSubMenu = lpmii->hSubMenu;
1661- wmii.hbmpChecked = lpmii->hbmpChecked;
1662- wmii.hbmpUnchecked = lpmii->hbmpUnchecked;
1663- wmii.dwItemData = lpmii->dwItemData;
1664- if(lpmii->fMask & MIIM_TYPE)
1665- {
1666- pw0 = DuplicateMtoWBuffer(lpmii->dwTypeData, -1, lpmii->cch * 4);
1667- wmii.dwTypeData = pw0;
1668- wmii.cch = lpmii->cch * 4;
1669- }
1670- wmii.hbmpItem = lpmii->hbmpItem;
1671- r = GetMenuItemInfoW(hmenu, item, fByPosition, &wmii);
1672- lpmii->fType = wmii.fType;
1673- lpmii->fState = wmii.fState;
1674- lpmii->wID = wmii.wID;
1675- lpmii->hSubMenu = wmii.hSubMenu;
1676- lpmii->hbmpChecked = wmii.hbmpChecked;
1677- lpmii->hbmpUnchecked = wmii.hbmpUnchecked;
1678- lpmii->dwItemData = wmii.dwItemData;
1679- WtoM(lpmii->dwTypeData, lpmii->cch, wmii.dwTypeData, -1);
1680- TerminateStringM(lpmii->dwTypeData, lpmii->cch);
1681-END_ROUTINE
1682- FreeDuplicatedString(pw0);
1683- return r;
1684-}
1685-
1686-HFONT CreateFontIndirectM(CONST LOGFONTA *lplf)
1687-{
1688- HFONT r = NULL;
1689- LOGFONTW wlf;
1690-START_ROUTINE
1691- wlf.lfHeight = lplf->lfHeight;
1692- wlf.lfWidth = lplf->lfWidth;
1693- wlf.lfEscapement = lplf->lfEscapement;
1694- wlf.lfOrientation = lplf->lfOrientation;
1695- wlf.lfWeight = lplf->lfWeight;
1696- wlf.lfItalic = lplf->lfItalic;
1697- wlf.lfUnderline = lplf->lfUnderline;
1698- wlf.lfStrikeOut = lplf->lfStrikeOut;
1699- wlf.lfCharSet = lplf->lfCharSet;
1700- wlf.lfOutPrecision = lplf->lfOutPrecision;
1701- wlf.lfClipPrecision = lplf->lfClipPrecision;
1702- wlf.lfQuality = lplf->lfQuality;
1703- wlf.lfPitchAndFamily = lplf->lfPitchAndFamily;
1704- MtoW(wlf.lfFaceName, LF_FACESIZE, lplf->lfFaceName, -1);
1705- TerminateStringW(wlf.lfFaceName, LF_FACESIZE);
1706- r = CreateFontIndirect(&wlf);
1707-END_ROUTINE
1708- return r;
1709-}
1710-
1711-BOOL ChooseFontM(LPCHOOSEFONTA v0)
1712-{
1713- BOOL r = FALSE;
1714- wchar_t* pw0 = NULL;
1715- CHOOSEFONTW a0;
1716- LOGFONTW* pwlf;
1717-START_ROUTINE
1718- a0.lStructSize = sizeof(CHOOSEFONTW);
1719- a0.hwndOwner = v0->hwndOwner;
1720- a0.hDC = v0->hDC;
1721- if(v0->lpLogFont && (pwlf = (LOGFONTW*)malloc(sizeof(LOGFONTW))))
1722- {
1723- pwlf->lfHeight = v0->lpLogFont->lfHeight;
1724- pwlf->lfWidth = v0->lpLogFont->lfWidth;
1725- pwlf->lfEscapement = v0->lpLogFont->lfEscapement;
1726- pwlf->lfOrientation = v0->lpLogFont->lfOrientation;
1727- pwlf->lfWeight = v0->lpLogFont->lfWeight;
1728- pwlf->lfItalic = v0->lpLogFont->lfItalic;
1729- pwlf->lfUnderline = v0->lpLogFont->lfUnderline;
1730- pwlf->lfStrikeOut = v0->lpLogFont->lfStrikeOut;
1731- pwlf->lfCharSet = v0->lpLogFont->lfCharSet;
1732- pwlf->lfOutPrecision = v0->lpLogFont->lfOutPrecision;
1733- pwlf->lfClipPrecision = v0->lpLogFont->lfClipPrecision;
1734- pwlf->lfQuality = v0->lpLogFont->lfQuality;
1735- pwlf->lfPitchAndFamily = v0->lpLogFont->lfPitchAndFamily;
1736- MtoW(pwlf->lfFaceName, LF_FACESIZE, v0->lpLogFont->lfFaceName, -1);
1737- TerminateStringW(pwlf->lfFaceName, LF_FACESIZE);
1738- }
1739- else
1740- pwlf = NULL;
1741- a0.lpLogFont = pwlf;
1742- a0.iPointSize = v0->iPointSize;
1743- a0.Flags = v0->Flags;
1744- a0.rgbColors = v0->rgbColors;
1745- a0.lCustData = v0->lCustData;
1746- a0.lpfnHook = v0->lpfnHook;
1747- a0.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);
1748- a0.hInstance = v0->hInstance;
1749- a0.lpszStyle = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4);
1750- a0.nFontType = v0->nFontType;
1751- a0.nSizeMin = v0->nSizeMin;
1752- a0.nSizeMax = v0->nSizeMax;
1753- r = ChooseFontW(&a0);
1754- if(v0->lpLogFont)
1755- {
1756- v0->lpLogFont->lfHeight = pwlf->lfHeight;
1757- v0->lpLogFont->lfWidth = pwlf->lfWidth;
1758- v0->lpLogFont->lfEscapement = pwlf->lfEscapement;
1759- v0->lpLogFont->lfOrientation = pwlf->lfOrientation;
1760- v0->lpLogFont->lfWeight = pwlf->lfWeight;
1761- v0->lpLogFont->lfItalic = pwlf->lfItalic;
1762- v0->lpLogFont->lfUnderline = pwlf->lfUnderline;
1763- v0->lpLogFont->lfStrikeOut = pwlf->lfStrikeOut;
1764- v0->lpLogFont->lfCharSet = pwlf->lfCharSet;
1765- v0->lpLogFont->lfOutPrecision = pwlf->lfOutPrecision;
1766- v0->lpLogFont->lfClipPrecision = pwlf->lfClipPrecision;
1767- v0->lpLogFont->lfQuality = pwlf->lfQuality;
1768- v0->lpLogFont->lfPitchAndFamily = pwlf->lfPitchAndFamily;
1769- WtoM(v0->lpLogFont->lfFaceName, LF_FACESIZE, pwlf->lfFaceName, -1);
1770- TerminateStringM(v0->lpLogFont->lfFaceName, LF_FACESIZE);
1771- }
1772- v0->rgbColors = a0.rgbColors;
1773- WtoM(v0->lpszStyle, LF_FACESIZE, a0.lpszStyle, -1);
1774- TerminateStringM(v0->lpszStyle, LF_FACESIZE);
1775- v0->nFontType = a0.nFontType;
1776- if(pwlf)
1777- free(pwlf);
1778- FreeDuplicatedString((void*)a0.lpTemplateName);
1779- FreeDuplicatedString(a0.lpszStyle);
1780-END_ROUTINE
1781- FreeDuplicatedString(pw0);
1782- return r;
1783-}
1784-
1785-INT_PTR DialogBoxParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
1786-{
1787- INT_PTR r = 0;
1788- wchar_t* pw0 = NULL;
1789-START_ROUTINE
1790- pw0 = DuplicateMtoW(lpTemplateName, -1);
1791- r = DialogBoxParamW(hInstance, pw0, hWndParent, lpDialogFunc, dwInitParam);
1792-END_ROUTINE
1793- FreeDuplicatedString(pw0);
1794- return r;
1795-}
1796-
1797-HWND CreateDialogParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
1798-{
1799- HWND r = NULL;
1800- wchar_t* pw0 = NULL;
1801-START_ROUTINE
1802- pw0 = DuplicateMtoW(lpTemplateName, -1);
1803- r = CreateDialogParamW(hInstance, pw0, hWndParent, lpDialogFunc, dwInitParam);
1804-END_ROUTINE
1805- FreeDuplicatedString(pw0);
1806- return r;
1807-}
1808-
1809-int mkdirM(const char * _Path)
1810-{
1811- int r = 0;
1812- wchar_t* pw0 = NULL;
1813-START_ROUTINE
1814- pw0 = DuplicateMtoW(_Path, -1);
1815- r = _wmkdir(pw0);
1816-END_ROUTINE
1817- FreeDuplicatedString(pw0);
1818- return r;
1819-}
1820-
1821-int _mkdirM(const char * _Path)
1822-{
1823- int r = 0;
1824- wchar_t* pw0 = NULL;
1825-START_ROUTINE
1826- pw0 = DuplicateMtoW(_Path, -1);
1827- r = _wmkdir(pw0);
1828-END_ROUTINE
1829- FreeDuplicatedString(pw0);
1830- return r;
1831-}
1832-
1833-int rmdirM(const char * _Path)
1834-{
1835- int r = 0;
1836- wchar_t* pw0 = NULL;
1837-START_ROUTINE
1838- pw0 = DuplicateMtoW(_Path, -1);
1839- r = _wrmdir(pw0);
1840-END_ROUTINE
1841- FreeDuplicatedString(pw0);
1842- return r;
1843-}
1844-
1845-int _rmdirM(const char * _Path)
1846-{
1847- int r = 0;
1848- wchar_t* pw0 = NULL;
1849-START_ROUTINE
1850- pw0 = DuplicateMtoW(_Path, -1);
1851- r = _wrmdir(pw0);
1852-END_ROUTINE
1853- FreeDuplicatedString(pw0);
1854- return r;
1855-}
1856-
1857-size_t _mbslenM(const unsigned char * _Str)
1858-{
1859- size_t r = 0;
1860- wchar_t* pw0 = NULL;
1861-START_ROUTINE
1862- pw0 = DuplicateMtoW(_Str, -1);
1863- r = wcslen(pw0);
1864-END_ROUTINE
1865- FreeDuplicatedString(pw0);
1866- return r;
1867-}
1868-
1869-unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch)
1870-{
1871- unsigned char* r = NULL;
1872- wchar_t* pw0 = NULL;
1873- wchar_t* wr;
1874-START_ROUTINE
1875- pw0 = DuplicateMtoW(_Str, -1);
1876- // TODO: 非ASCII文字の対応
1877- wr = wcschr(pw0, _Ch);
1878- if(wr)
1879- {
1880- *wr = L'\0';
1881- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
1882- }
1883-END_ROUTINE
1884- FreeDuplicatedString(pw0);
1885- return r;
1886-}
1887-
1888-unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch)
1889-{
1890- unsigned char* r = NULL;
1891- wchar_t* pw0 = NULL;
1892- wchar_t* wr;
1893-START_ROUTINE
1894- pw0 = DuplicateMtoW(_Str, -1);
1895- // TODO: 非ASCII文字の対応
1896- wr = wcsrchr(pw0, _Ch);
1897- if(wr)
1898- {
1899- *wr = L'\0';
1900- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
1901- }
1902-END_ROUTINE
1903- FreeDuplicatedString(pw0);
1904- return r;
1905-}
1906-
1907-unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr)
1908-{
1909- unsigned char* r = NULL;
1910- wchar_t* pw0 = NULL;
1911- wchar_t* pw1 = NULL;
1912- wchar_t* wr;
1913-START_ROUTINE
1914- pw0 = DuplicateMtoW(_Str, -1);
1915- pw1 = DuplicateMtoW(_Substr, -1);
1916- wr = wcsstr(pw0, pw1);
1917- if(wr)
1918- {
1919- *wr = L'\0';
1920- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
1921- }
1922-END_ROUTINE
1923- FreeDuplicatedString(pw0);
1924- FreeDuplicatedString(pw1);
1925- return r;
1926-}
1927-
1928-int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2)
1929-{
1930- int r = 0;
1931- wchar_t* pw0 = NULL;
1932- wchar_t* pw1 = NULL;
1933-START_ROUTINE
1934- pw0 = DuplicateMtoW(_Str1, -1);
1935- pw1 = DuplicateMtoW(_Str2, -1);
1936- r = wcscmp(pw0, pw1);
1937-END_ROUTINE
1938- FreeDuplicatedString(pw0);
1939- FreeDuplicatedString(pw1);
1940- return r;
1941-}
1942-
1943-int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2)
1944-{
1945- int r = 0;
1946- wchar_t* pw0 = NULL;
1947- wchar_t* pw1 = NULL;
1948-START_ROUTINE
1949- pw0 = DuplicateMtoW(_Str1, -1);
1950- pw1 = DuplicateMtoW(_Str2, -1);
1951- r = _wcsicmp(pw0, pw1);
1952-END_ROUTINE
1953- FreeDuplicatedString(pw0);
1954- FreeDuplicatedString(pw1);
1955- return r;
1956-}
1957-
1958-int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount)
1959-{
1960- int r = 0;
1961- wchar_t* pw0 = NULL;
1962- wchar_t* pw1 = NULL;
1963-START_ROUTINE
1964- pw0 = DuplicateMtoW(_Str1, -1);
1965- pw1 = DuplicateMtoW(_Str2, -1);
1966- r = wcsncmp(pw0, pw1, _MaxCount);
1967-END_ROUTINE
1968- FreeDuplicatedString(pw0);
1969- FreeDuplicatedString(pw1);
1970- return r;
1971-}
1972-
1973-unsigned char * _mbslwrM(unsigned char * _String)
1974-{
1975- unsigned char* r = NULL;
1976- wchar_t* pw0 = NULL;
1977-START_ROUTINE
1978- pw0 = DuplicateMtoW(_String, -1);
1979- _wcslwr(pw0);
1980- r = _String;
1981- WtoM(_String, strlen(_String) + 1, pw0, -1);
1982-END_ROUTINE
1983- FreeDuplicatedString(pw0);
1984- return r;
1985-}
1986-
1987-unsigned char * _mbsuprM(unsigned char * _String)
1988-{
1989- unsigned char* r = NULL;
1990- wchar_t* pw0 = NULL;
1991-START_ROUTINE
1992- pw0 = DuplicateMtoW(_String, -1);
1993- _wcsupr(pw0);
1994- r = _String;
1995- WtoM(_String, strlen(_String) + 1, pw0, -1);
1996-END_ROUTINE
1997- FreeDuplicatedString(pw0);
1998- return r;
1999-}
2000-
2001-unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count)
2002-{
2003- unsigned char* r = NULL;
2004- wchar_t* pw0 = NULL;
2005- wchar_t* wr;
2006-START_ROUTINE
2007- pw0 = DuplicateMtoW(_Str, -1);
2008- wr = _wcsninc(pw0, _Count);
2009- if(wr)
2010- {
2011- *wr = L'\0';
2012- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
2013- }
2014-END_ROUTINE
2015- FreeDuplicatedString(pw0);
2016- return r;
2017-}
2018-
2019-FILE * fopenM(const char * _Filename, const char * _Mode)
2020-{
2021- FILE* r = NULL;
2022- wchar_t* pw0 = NULL;
2023- wchar_t* pw1 = NULL;
2024-START_ROUTINE
2025- pw0 = DuplicateMtoW(_Filename, -1);
2026- pw1 = DuplicateMtoW(_Mode, -1);
2027- r = _wfopen(pw0, pw1);
2028-END_ROUTINE
2029- FreeDuplicatedString(pw0);
2030- FreeDuplicatedString(pw1);
2031- return r;
2032-}
2033-
1+// mbswrapper.c
2+// Copyright (C) 2011 Suguru Kawamoto
3+// マルチバイト文字ワイド文字APIラッパー
4+// マルチバイト文字はUTF-8、ワイド文字はUTF-16であるものとする
5+// 全ての制御用の文字はASCIIの範囲であるため、Shift_JISとUTF-8間の変換は不要
6+
7+#define UNICODE
8+#define _UNICODE
9+
10+#include <tchar.h>
11+#include <direct.h>
12+#include <windows.h>
13+#include <commctrl.h>
14+#include <shlobj.h>
15+#include <htmlhelp.h>
16+
17+#define DO_NOT_REPLACE
18+#include "mbswrapper.h"
19+
20+// マルチバイト文字列からワイド文字列へ変換
21+int MtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
22+{
23+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
24+ return 0;
25+ if(pDst)
26+ return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, pDst, size);
27+ return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, NULL, 0);
28+}
29+
30+// ワイド文字列からマルチバイト文字列へ変換
31+int WtoM(LPSTR pDst, int size, LPCWSTR pSrc, int count)
32+{
33+ if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
34+ return 0;
35+ if(pDst)
36+ return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, pDst, size, NULL, NULL);
37+ return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, NULL, 0, NULL, NULL);
38+}
39+
40+// Shift_JIS文字列からワイド文字列へ変換
41+int AtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
42+{
43+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
44+ return 0;
45+ if(pDst)
46+ return MultiByteToWideChar(CP_ACP, 0, pSrc, count, pDst, size);
47+ return MultiByteToWideChar(CP_ACP, 0, pSrc, count, NULL, 0);
48+}
49+
50+// ワイド文字列からShift_JIS文字列へ変換
51+int WtoA(LPSTR pDst, int size, LPCWSTR pSrc, int count)
52+{
53+ if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
54+ return 0;
55+ if(pDst)
56+ return WideCharToMultiByte(CP_ACP, 0, pSrc, count, pDst, size, NULL, NULL);
57+ return WideCharToMultiByte(CP_ACP, 0, pSrc, count, NULL, 0, NULL, NULL);
58+}
59+
60+// マルチバイト文字列バッファ終端を強制的にNULLで置換
61+int TerminateStringM(LPSTR lpString, int size)
62+{
63+ int i;
64+ if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
65+ return 0;
66+ for(i = 0; i < size; i++)
67+ {
68+ if(lpString[i] == '\0')
69+ return i;
70+ }
71+ i--;
72+ lpString[i] = '\0';
73+ return i;
74+}
75+
76+// ワイド文字列バッファ終端を強制的にNULLで置換
77+int TerminateStringW(LPWSTR lpString, int size)
78+{
79+ int i;
80+ if(lpString < (LPWSTR)0x00010000 || lpString == (LPWSTR)~0)
81+ return 0;
82+ for(i = 0; i < size; i++)
83+ {
84+ if(lpString[i] == L'\0')
85+ return i;
86+ }
87+ i--;
88+ lpString[i] = L'\0';
89+ return i;
90+}
91+
92+// Shift_JIS文字列バッファ終端を強制的にNULLで置換
93+int TerminateStringA(LPSTR lpString, int size)
94+{
95+ int i;
96+ if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
97+ return 0;
98+ for(i = 0; i < size; i++)
99+ {
100+ if(lpString[i] == '\0')
101+ return i;
102+ }
103+ i--;
104+ lpString[i] = '\0';
105+ return i;
106+}
107+
108+// NULL区切り複数マルチバイト文字列の長さを取得
109+size_t GetMultiStringLengthM(LPCSTR lpString)
110+{
111+ size_t i;
112+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
113+ return 0;
114+ i = 0;
115+ while(lpString[i] != '\0' || lpString[i + 1] != '\0')
116+ {
117+ i++;
118+ }
119+ i++;
120+ return i;
121+}
122+
123+// NULL区切り複数ワイド文字列の長さを取得
124+size_t GetMultiStringLengthW(LPCWSTR lpString)
125+{
126+ size_t i;
127+ if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
128+ return 0;
129+ i = 0;
130+ while(lpString[i] != L'\0' || lpString[i + 1] != L'\0')
131+ {
132+ i++;
133+ }
134+ i++;
135+ return i;
136+}
137+
138+// NULL区切り複数Shift_JIS文字列の長さを取得
139+size_t GetMultiStringLengthA(LPCSTR lpString)
140+{
141+ size_t i;
142+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
143+ return 0;
144+ i = 0;
145+ while(lpString[i] != '\0' || lpString[i + 1] != '\0')
146+ {
147+ i++;
148+ }
149+ i++;
150+ return i;
151+}
152+
153+// NULL区切りマルチバイト文字列からワイド文字列へ変換
154+int MtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
155+{
156+ int i;
157+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
158+ return 0;
159+ if(!pDst)
160+ return GetMultiStringLengthM(pSrc);
161+ i = 0;
162+ while(*pSrc != '\0')
163+ {
164+ i += MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1);
165+ pSrc += strlen(pSrc) + 1;
166+ }
167+ pDst[i] = L'\0';
168+ return i;
169+}
170+
171+// NULL区切りワイド文字列からマルチバイト文字列へ変換
172+int WtoMMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
173+{
174+ int i;
175+ if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
176+ return 0;
177+ if(!pDst)
178+ return GetMultiStringLengthW(pSrc);
179+ i = 0;
180+ while(*pSrc != L'\0')
181+ {
182+ i += WideCharToMultiByte(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
183+ pSrc += wcslen(pSrc) + 1;
184+ }
185+ pDst[i] = '\0';
186+ return i;
187+}
188+
189+// NULL区切りShift_JIS文字列からワイド文字列へ変換
190+int AtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
191+{
192+ int i;
193+ if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
194+ return 0;
195+ if(!pDst)
196+ return GetMultiStringLengthA(pSrc);
197+ i = 0;
198+ while(*pSrc != '\0')
199+ {
200+ i += MultiByteToWideChar(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1);
201+ pSrc += strlen(pSrc) + 1;
202+ }
203+ pDst[i] = L'\0';
204+ return i;
205+}
206+
207+// NULL区切りワイド文字列からShift_JIS文字列へ変換
208+int WtoAMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
209+{
210+ int i;
211+ if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
212+ return 0;
213+ if(!pDst)
214+ return GetMultiStringLengthW(pSrc);
215+ i = 0;
216+ while(*pSrc != L'\0')
217+ {
218+ i += WideCharToMultiByte(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
219+ pSrc += wcslen(pSrc) + 1;
220+ }
221+ pDst[i] = '\0';
222+ return i;
223+}
224+
225+// マルチバイト文字列用のメモリを確保
226+char* AllocateStringM(int size)
227+{
228+ char* p;
229+ // 0が指定される場合があるため1文字分追加
230+ p = (char*)malloc(sizeof(char) * (size + 1));
231+ // 念のため先頭にNULL文字を代入
232+ if(p)
233+ *p = '\0';
234+ return p;
235+}
236+
237+// ワイド文字列用のメモリを確保
238+wchar_t* AllocateStringW(int size)
239+{
240+ wchar_t* p;
241+ // 0が指定される場合があるため1文字分追加
242+ p = (wchar_t*)malloc(sizeof(wchar_t) * (size + 1));
243+ // 念のため先頭にNULL文字を代入
244+ if(p)
245+ *p = L'\0';
246+ return p;
247+}
248+
249+// Shift_JIS文字列用のメモリを確保
250+char* AllocateStringA(int size)
251+{
252+ char* p;
253+ // 0が指定される場合があるため1文字分追加
254+ p = (char*)malloc(sizeof(char) * (size + 1));
255+ // 念のため先頭にNULL文字を代入
256+ if(p)
257+ *p = '\0';
258+ return p;
259+}
260+
261+// メモリを確保してマルチバイト文字列からワイド文字列へ変換
262+// リソースIDならば元の値を返す
263+wchar_t* DuplicateMtoW(LPCSTR lpString, int c)
264+{
265+ wchar_t* p;
266+ int i;
267+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
268+ return (wchar_t*)lpString;
269+ if(c < 0)
270+ c = strlen(lpString);
271+ p = AllocateStringW(MtoW(NULL, 0, lpString, c) + 1);
272+ if(p)
273+ {
274+ i = MtoW(p, 65535, lpString, c);
275+ p[i] = L'\0';
276+ }
277+ return p;
278+}
279+
280+// 指定したサイズのメモリを確保してマルチバイト文字列からワイド文字列へ変換
281+// リソースIDならば元の値を返す
282+wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size)
283+{
284+ wchar_t* p;
285+ int i;
286+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
287+ return (wchar_t*)lpString;
288+ if(c < 0)
289+ c = strlen(lpString);
290+ p = AllocateStringW(size);
291+ if(p)
292+ {
293+ i = MtoW(p, size, lpString, c);
294+ p[i] = L'\0';
295+ }
296+ return p;
297+}
298+
299+// メモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
300+// リソースIDならば元の値を返す
301+wchar_t* DuplicateMtoWMultiString(LPCSTR lpString)
302+{
303+ int count;
304+ wchar_t* p;
305+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
306+ return (wchar_t*)lpString;
307+ count = GetMultiStringLengthM(lpString) + 1;
308+ p = AllocateStringW(count);
309+ if(p)
310+ MtoW(p, count, lpString, count);
311+ return p;
312+}
313+
314+// 指定したサイズのメモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
315+// リソースIDならば元の値を返す
316+wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size)
317+{
318+ int count;
319+ wchar_t* p;
320+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
321+ return (wchar_t*)lpString;
322+ count = GetMultiStringLengthM(lpString) + 1;
323+ p = AllocateStringW(size);
324+ if(p)
325+ {
326+ MtoW(p, size, lpString, count);
327+ p[size - 2] = L'\0';
328+ p[size - 1] = L'\0';
329+ }
330+ return p;
331+}
332+
333+// メモリを確保してワイド文字列からマルチバイト文字列へ変換
334+// リソースIDならば元の値を返す
335+char* DuplicateWtoM(LPCWSTR lpString, int c)
336+{
337+ char* p;
338+ int i;
339+ if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
340+ return (char*)lpString;
341+ if(c < 0)
342+ c = wcslen(lpString);
343+ p = AllocateStringM(WtoM(NULL, 0, lpString, c) + 1);
344+ if(p)
345+ {
346+ i = WtoM(p, 65535, lpString, c);
347+ p[i] = L'\0';
348+ }
349+ return p;
350+}
351+
352+// メモリを確保してShift_JIS文字列からワイド文字列へ変換
353+// リソースIDならば元の値を返す
354+wchar_t* DuplicateAtoW(LPCSTR lpString, int c)
355+{
356+ wchar_t* p;
357+ int i;
358+ if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
359+ return (wchar_t*)lpString;
360+ if(c < 0)
361+ c = strlen(lpString);
362+ p = AllocateStringW(AtoW(NULL, 0, lpString, c) + 1);
363+ if(p)
364+ {
365+ i = AtoW(p, 65535, lpString, c);
366+ p[i] = L'\0';
367+ }
368+ return p;
369+}
370+
371+// メモリを確保してワイド文字列からShift_JIS文字列へ変換
372+// リソースIDならば元の値を返す
373+char* DuplicateWtoA(LPCWSTR lpString, int c)
374+{
375+ char* p;
376+ int i;
377+ if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
378+ return (char*)lpString;
379+ if(c < 0)
380+ c = wcslen(lpString);
381+ p = AllocateStringA(WtoA(NULL, 0, lpString, c) + 1);
382+ if(p)
383+ {
384+ i = WtoA(p, 65535, lpString, c);
385+ p[i] = L'\0';
386+ }
387+ return p;
388+}
389+
390+// 文字列用に確保したメモリを開放
391+// リソースIDならば何もしない
392+void FreeDuplicatedString(void* p)
393+{
394+ if(p < (void*)0x00010000 || p == (void*)~0)
395+ return;
396+ free(p);
397+}
398+
399+// 以下ラッパー
400+// 戻り値バッファ r
401+// ワイド文字バッファ pw%d
402+// マルチバイト文字バッファ pm%d
403+// 引数バッファ a%d
404+
405+#pragma warning(disable:4102)
406+#define START_ROUTINE do{
407+#define END_ROUTINE }while(0);end_of_routine:
408+#define QUIT_ROUTINE goto end_of_routine;
409+
410+int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
411+{
412+ int r = 0;
413+ char* pm0 = NULL;
414+START_ROUTINE
415+ pm0 = DuplicateWtoM(lpCmdLine, -1);
416+ r = WinMainM(hInstance, hPrevInstance, pm0, nCmdShow);
417+END_ROUTINE
418+ FreeDuplicatedString(pm0);
419+ return r;
420+}
421+
422+HMODULE LoadLibraryM(LPCSTR lpLibFileName)
423+{
424+ HMODULE r = NULL;
425+ wchar_t* pw0 = NULL;
426+START_ROUTINE
427+ pw0 = DuplicateMtoW(lpLibFileName, -1);
428+ r = LoadLibraryW(pw0);
429+END_ROUTINE
430+ FreeDuplicatedString(pw0);
431+ return r;
432+}
433+
434+HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
435+{
436+ HANDLE r = INVALID_HANDLE_VALUE;
437+ wchar_t* pw0 = NULL;
438+START_ROUTINE
439+ pw0 = DuplicateMtoW(lpFileName, -1);
440+ r = CreateFileW(pw0, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
441+END_ROUTINE
442+ FreeDuplicatedString(pw0);
443+ return r;
444+}
445+
446+int MessageBoxM(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
447+{
448+ int r = IDOK;
449+ wchar_t* pw0 = NULL;
450+ wchar_t* pw1 = NULL;
451+START_ROUTINE
452+ pw0 = DuplicateMtoW(lpText, -1);
453+ pw1 = DuplicateMtoW(lpCaption, -1);
454+ r = MessageBoxW(hWnd, pw0, pw1, uType);
455+END_ROUTINE
456+ FreeDuplicatedString(pw0);
457+ FreeDuplicatedString(pw1);
458+ return r;
459+}
460+
461+HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
462+{
463+ HANDLE r = INVALID_HANDLE_VALUE;
464+ wchar_t* pw0 = NULL;
465+ WIN32_FIND_DATAW a0;
466+START_ROUTINE
467+ pw0 = DuplicateMtoW(lpFileName, -1);
468+ r = FindFirstFileW(pw0, &a0);
469+ if(r != INVALID_HANDLE_VALUE)
470+ {
471+ lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
472+ lpFindFileData->ftCreationTime = a0.ftCreationTime;
473+ lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
474+ lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
475+ lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
476+ lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
477+ lpFindFileData->dwReserved0 = a0.dwReserved0;
478+ lpFindFileData->dwReserved1 = a0.dwReserved1;
479+ WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
480+ WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
481+ }
482+END_ROUTINE
483+ FreeDuplicatedString(pw0);
484+ return r;
485+}
486+
487+BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
488+{
489+ BOOL r = FALSE;
490+ WIN32_FIND_DATAW a0;
491+START_ROUTINE
492+ r = FindNextFileW(hFindFile, &a0);
493+ if(r)
494+ {
495+ lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
496+ lpFindFileData->ftCreationTime = a0.ftCreationTime;
497+ lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
498+ lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
499+ lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
500+ lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
501+ lpFindFileData->dwReserved0 = a0.dwReserved0;
502+ lpFindFileData->dwReserved1 = a0.dwReserved1;
503+ WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
504+ WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
505+ }
506+END_ROUTINE
507+ return r;
508+}
509+
510+DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer)
511+{
512+ DWORD r = 0;
513+ wchar_t* pw0 = NULL;
514+START_ROUTINE
515+ pw0 = AllocateStringW(nBufferLength * 4);
516+ GetLogicalDriveStringsW(nBufferLength * 4, pw0);
517+ WtoMMultiString(lpBuffer, nBufferLength, pw0);
518+ r = TerminateStringM(lpBuffer, nBufferLength);
519+END_ROUTINE
520+ FreeDuplicatedString(pw0);
521+ return r;
522+}
523+
524+ATOM RegisterClassExM(CONST WNDCLASSEXA * v0)
525+{
526+ ATOM r = 0;
527+START_ROUTINE
528+ // WNDPROCがShift_JIS用であるため
529+ r = RegisterClassExA(v0);
530+END_ROUTINE
531+ return r;
532+}
533+
534+HWND CreateWindowExM(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
535+{
536+ HWND r = NULL;
537+ wchar_t* pw0 = NULL;
538+ wchar_t* pw1 = NULL;
539+START_ROUTINE
540+ pw0 = DuplicateMtoW(lpClassName, -1);
541+ pw1 = DuplicateMtoW(lpWindowName, -1);
542+ r = CreateWindowExW(dwExStyle, pw0, pw1, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
543+END_ROUTINE
544+ FreeDuplicatedString(pw0);
545+ FreeDuplicatedString(pw1);
546+ return r;
547+}
548+
549+LONG GetWindowLongM(HWND hWnd, int nIndex)
550+{
551+ LRESULT r = 0;
552+START_ROUTINE
553+ // WNDPROCがShift_JIS用であるため
554+ if(IsWindowUnicode(hWnd))
555+ r = GetWindowLongW(hWnd, nIndex);
556+ else
557+ r = GetWindowLongA(hWnd, nIndex);
558+END_ROUTINE
559+ return r;
560+}
561+
562+LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong)
563+{
564+ LRESULT r = 0;
565+START_ROUTINE
566+ // WNDPROCがShift_JIS用であるため
567+ if(IsWindowUnicode(hWnd))
568+ r = SetWindowLongW(hWnd, nIndex, dwNewLong);
569+ else
570+ r = SetWindowLongA(hWnd, nIndex, dwNewLong);
571+END_ROUTINE
572+ return r;
573+}
574+
575+LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
576+{
577+ LRESULT r = 0;
578+START_ROUTINE
579+ // WNDPROCがShift_JIS用であるため
580+ if(IsWindowUnicode(hWnd))
581+ r = DefWindowProcW(hWnd, Msg, wParam, lParam);
582+ else
583+ r = DefWindowProcA(hWnd, Msg, wParam, lParam);
584+END_ROUTINE
585+ return r;
586+}
587+
588+LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
589+{
590+ LRESULT r = 0;
591+START_ROUTINE
592+ // WNDPROCがShift_JIS用であるため
593+ if(IsWindowUnicode(hWnd))
594+ r = CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
595+ else
596+ r = CallWindowProcA(lpPrevWndFunc, hWnd, Msg, wParam, lParam);
597+END_ROUTINE
598+ return r;
599+}
600+
601+LRESULT SendMessageM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
602+{
603+ LRESULT r = 0;
604+ wchar_t* pw0 = NULL;
605+ wchar_t* pw1 = NULL;
606+ int Size;
607+ LVITEMA* pmLVItem;
608+ LVITEMW wLVItem;
609+ LVFINDINFOA* pmLVFindInfo;
610+ LVFINDINFOW wLVFindInfo;
611+ LVCOLUMNA* pmLVColumn;
612+ LVCOLUMNW wLVColumn;
613+ TVITEMEXA* pmTVItem;
614+ TVITEMEXW wTVItem;
615+ TVINSERTSTRUCTA* pmTVInsert;
616+ TVINSERTSTRUCTW wTVInsert;
617+ wchar_t ClassName[MAX_PATH];
618+START_ROUTINE
619+ switch(Msg)
620+ {
621+ case WM_SETTEXT:
622+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
623+ r = SendMessageW(hWnd, WM_SETTEXT, wParam, (LPARAM)pw0);
624+ break;
625+ case WM_GETTEXT:
626+ pw0 = AllocateStringW(wParam * 4);
627+ SendMessageW(hWnd, WM_GETTEXT, wParam * 4, (LPARAM)pw0);
628+ WtoM((LPSTR)lParam, wParam, pw0, -1);
629+ r = TerminateStringM((LPSTR)lParam, wParam);
630+ break;
631+ case WM_GETTEXTLENGTH:
632+ Size = SendMessageW(hWnd, WM_GETTEXTLENGTH, wParam, lParam) + 1;
633+ pw0 = AllocateStringW(Size);
634+ SendMessageW(hWnd, WM_GETTEXT, (WPARAM)Size, (LPARAM)pw0);
635+ r = WtoM(NULL, 0, pw0, -1) - 1;
636+ break;
637+ default:
638+ GetClassNameW(hWnd, ClassName, sizeof(ClassName) / sizeof(wchar_t));
639+ if(_wcsicmp(ClassName, WC_EDITW) == 0)
640+ {
641+ switch(Msg)
642+ {
643+ case EM_REPLACESEL:
644+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
645+ r = SendMessageW(hWnd, EM_REPLACESEL, wParam, (LPARAM)pw0);
646+ break;
647+ default:
648+ r = SendMessageW(hWnd, Msg, wParam, lParam);
649+ break;
650+ }
651+ }
652+ else if(_wcsicmp(ClassName, WC_COMBOBOXW) == 0)
653+ {
654+ switch(Msg)
655+ {
656+ case CB_ADDSTRING:
657+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
658+ r = SendMessageW(hWnd, CB_ADDSTRING, wParam, (LPARAM)pw0);
659+ break;
660+ case CB_GETLBTEXT:
661+ Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
662+ pw0 = AllocateStringW(Size);
663+ SendMessageW(hWnd, CB_GETLBTEXT, wParam, (LPARAM)pw0);
664+ // バッファ長不明のためオーバーランの可能性あり
665+ WtoM((LPSTR)lParam, Size * 4, pw0, -1);
666+ r = TerminateStringM((LPSTR)lParam, Size * 4);
667+ break;
668+ case CB_GETLBTEXTLEN:
669+ Size = SendMessageW(hWnd, CB_GETLBTEXTLEN, wParam, 0) + 1;
670+ pw0 = AllocateStringW(Size);
671+ SendMessageW(hWnd, WM_GETTEXT, wParam, (LPARAM)pw0);
672+ r = WtoM(NULL, 0, pw0, -1) - 1;
673+ break;
674+ case CB_INSERTSTRING:
675+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
676+ r = SendMessageW(hWnd, CB_INSERTSTRING, wParam, (LPARAM)pw0);
677+ break;
678+ case CB_FINDSTRINGEXACT:
679+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
680+ r = SendMessageW(hWnd, CB_FINDSTRINGEXACT, wParam, (LPARAM)pw0);
681+ break;
682+ default:
683+ r = SendMessageW(hWnd, Msg, wParam, lParam);
684+ break;
685+ }
686+ }
687+ else if(_wcsicmp(ClassName, WC_LISTBOXW) == 0)
688+ {
689+ switch(Msg)
690+ {
691+ case LB_ADDSTRING:
692+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
693+ r = SendMessageW(hWnd, LB_ADDSTRING, wParam, (LPARAM)pw0);
694+ break;
695+ case LB_INSERTSTRING:
696+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
697+ r = SendMessageW(hWnd, LB_INSERTSTRING, wParam, (LPARAM)pw0);
698+ break;
699+ case LB_GETTEXT:
700+ Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
701+ pw0 = AllocateStringW(Size);
702+ SendMessageW(hWnd, LB_GETTEXT, wParam, (LPARAM)pw0);
703+ // バッファ長不明のためオーバーランの可能性あり
704+ WtoM((LPSTR)lParam, Size * 4, pw0, -1);
705+ r = TerminateStringM((LPSTR)lParam, Size * 4);
706+ break;
707+ case LB_GETTEXTLEN:
708+ Size = SendMessageW(hWnd, LB_GETTEXTLEN, wParam, 0) + 1;
709+ pw0 = AllocateStringW(Size);
710+ SendMessageW(hWnd, WM_GETTEXT, wParam, (LPARAM)pw0);
711+ r = WtoM(NULL, 0, pw0, -1) - 1;
712+ break;
713+ default:
714+ r = SendMessageW(hWnd, Msg, wParam, lParam);
715+ break;
716+ }
717+ }
718+ else if(_wcsicmp(ClassName, WC_LISTVIEWW) == 0)
719+ {
720+ switch(Msg)
721+ {
722+ case LVM_GETITEMA:
723+ pmLVItem = (LVITEMA*)lParam;
724+ wLVItem.mask = pmLVItem->mask;
725+ wLVItem.iItem = pmLVItem->iItem;
726+ wLVItem.iSubItem = pmLVItem->iSubItem;
727+ wLVItem.state = pmLVItem->state;
728+ wLVItem.stateMask = pmLVItem->stateMask;
729+ if(pmLVItem->mask & LVIF_TEXT)
730+ {
731+ Size = pmLVItem->cchTextMax * 4;
732+ pw0 = AllocateStringW(Size);
733+ wLVItem.pszText = pw0;
734+ wLVItem.cchTextMax = Size;
735+ }
736+ wLVItem.iImage = pmLVItem->iImage;
737+ wLVItem.lParam = pmLVItem->lParam;
738+ wLVItem.iIndent = pmLVItem->iIndent;
739+ r = SendMessageW(hWnd, LVM_GETITEMW, wParam, (LPARAM)&wLVItem);
740+ pmLVItem->mask = wLVItem.mask;
741+ pmLVItem->iItem = wLVItem.iItem;
742+ pmLVItem->iSubItem = wLVItem.iSubItem;
743+ pmLVItem->state = wLVItem.state;
744+ pmLVItem->stateMask = wLVItem.stateMask;
745+ if(pmLVItem->mask & LVIF_TEXT)
746+ {
747+ WtoM(pmLVItem->pszText, pmLVItem->cchTextMax, wLVItem.pszText, -1);
748+ TerminateStringM(pmLVItem->pszText, pmLVItem->cchTextMax);
749+ }
750+ pmLVItem->iImage = wLVItem.iImage;
751+ pmLVItem->lParam = wLVItem.lParam;
752+ pmLVItem->iIndent = wLVItem.iIndent;
753+ break;
754+ case LVM_SETITEMA:
755+ pmLVItem = (LVITEMA*)lParam;
756+ wLVItem.mask = pmLVItem->mask;
757+ wLVItem.iItem = pmLVItem->iItem;
758+ wLVItem.iSubItem = pmLVItem->iSubItem;
759+ wLVItem.state = pmLVItem->state;
760+ wLVItem.stateMask = pmLVItem->stateMask;
761+ if(pmLVItem->mask & LVIF_TEXT)
762+ {
763+ pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
764+ wLVItem.pszText = pw0;
765+ // TODO: cchTextMaxの確認
766+ wLVItem.cchTextMax = pmLVItem->cchTextMax;
767+ }
768+ wLVItem.iImage = pmLVItem->iImage;
769+ wLVItem.lParam = pmLVItem->lParam;
770+ wLVItem.iIndent = pmLVItem->iIndent;
771+ r = SendMessageW(hWnd, LVM_SETITEMW, wParam, (LPARAM)&wLVItem);
772+ break;
773+ case LVM_INSERTITEMA:
774+ pmLVItem = (LVITEMA*)lParam;
775+ wLVItem.mask = pmLVItem->mask;
776+ wLVItem.iItem = pmLVItem->iItem;
777+ wLVItem.iSubItem = pmLVItem->iSubItem;
778+ wLVItem.state = pmLVItem->state;
779+ wLVItem.stateMask = pmLVItem->stateMask;
780+ if(pmLVItem->mask & LVIF_TEXT)
781+ {
782+ pw0 = DuplicateMtoW(pmLVItem->pszText, -1);
783+ wLVItem.pszText = pw0;
784+ // TODO: cchTextMaxの確認
785+ wLVItem.cchTextMax = pmLVItem->cchTextMax;
786+ }
787+ wLVItem.iImage = pmLVItem->iImage;
788+ wLVItem.lParam = pmLVItem->lParam;
789+ wLVItem.iIndent = pmLVItem->iIndent;
790+ r = SendMessageW(hWnd, LVM_INSERTITEMW, wParam, (LPARAM)&wLVItem);
791+ break;
792+ case LVM_FINDITEMA:
793+ pmLVFindInfo = (LVFINDINFOA*)lParam;
794+ wLVFindInfo.flags = pmLVFindInfo->flags;
795+ if(pmLVFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL))
796+ {
797+ pw0 = DuplicateMtoW(pmLVFindInfo->psz, -1);
798+ wLVFindInfo.psz = pw0;
799+ }
800+ wLVFindInfo.lParam = pmLVFindInfo->lParam;
801+ wLVFindInfo.pt = pmLVFindInfo->pt;
802+ wLVFindInfo.vkDirection = pmLVFindInfo->vkDirection;
803+ r = SendMessageW(hWnd, LVM_FINDITEMW, wParam, (LPARAM)&wLVItem);
804+ break;
805+ case LVM_GETCOLUMNA:
806+ pmLVColumn = (LVCOLUMNA*)lParam;
807+ wLVColumn.mask = pmLVColumn->mask;
808+ wLVColumn.fmt = pmLVColumn->fmt;
809+ wLVColumn.cx = pmLVColumn->cx;
810+ Size = pmLVColumn->cchTextMax * 4;
811+ if(pmLVColumn->mask & LVCF_TEXT)
812+ {
813+ pw0 = AllocateStringW(Size);
814+ wLVColumn.pszText = pw0;
815+ wLVColumn.cchTextMax = Size;
816+ }
817+ wLVColumn.iSubItem = pmLVColumn->iSubItem;
818+ wLVColumn.iImage = pmLVColumn->iImage;
819+ wLVColumn.iOrder = pmLVColumn->iOrder;
820+ r = SendMessageW(hWnd, LVM_GETCOLUMNW, wParam, (LPARAM)&wLVColumn);
821+ pmLVColumn->mask = wLVColumn.mask;
822+ pmLVColumn->fmt = wLVColumn.fmt;
823+ pmLVColumn->cx = wLVColumn.cx;
824+ if(pmLVColumn->mask & LVCF_TEXT)
825+ {
826+ WtoM(pmLVColumn->pszText, pmLVColumn->cchTextMax, wLVColumn.pszText, -1);
827+ TerminateStringM(pmLVColumn->pszText, pmLVColumn->cchTextMax);
828+ }
829+ pmLVColumn->iSubItem = wLVColumn.iSubItem;
830+ pmLVColumn->iImage = wLVColumn.iImage;
831+ pmLVColumn->iOrder = wLVColumn.iOrder;
832+ break;
833+ case LVM_INSERTCOLUMNA:
834+ pmLVColumn = (LVCOLUMNA*)lParam;
835+ wLVColumn.mask = pmLVColumn->mask;
836+ wLVColumn.fmt = pmLVColumn->fmt;
837+ wLVColumn.cx = pmLVColumn->cx;
838+ if(pmLVColumn->mask & LVCF_TEXT)
839+ {
840+ pw0 = DuplicateMtoW(pmLVColumn->pszText, -1);
841+ wLVColumn.pszText = pw0;
842+ // TODO: cchTextMaxの確認
843+ wLVColumn.cchTextMax = pmLVColumn->cchTextMax;
844+ }
845+ wLVColumn.iSubItem = pmLVColumn->iSubItem;
846+ wLVColumn.iImage = pmLVColumn->iImage;
847+ wLVColumn.iOrder = pmLVColumn->iOrder;
848+ r = SendMessageW(hWnd, LVM_INSERTCOLUMNW, wParam, (LPARAM)&wLVColumn);
849+ break;
850+ case LVM_GETITEMTEXTA:
851+ pmLVItem = (LVITEMA*)lParam;
852+ wLVItem.mask = pmLVItem->mask;
853+ wLVItem.iItem = pmLVItem->iItem;
854+ wLVItem.iSubItem = pmLVItem->iSubItem;
855+ wLVItem.state = pmLVItem->state;
856+ wLVItem.stateMask = pmLVItem->stateMask;
857+ Size = pmLVItem->cchTextMax * 4;
858+ pw0 = AllocateStringW(Size);
859+ wLVItem.pszText = pw0;
860+ wLVItem.cchTextMax = Size;
861+ wLVItem.iImage = pmLVItem->iImage;
862+ wLVItem.lParam = pmLVItem->lParam;
863+ wLVItem.iIndent = pmLVItem->iIndent;
864+ r = SendMessageW(hWnd, LVM_GETITEMTEXTW, wParam, (LPARAM)&wLVItem);
865+ pmLVItem->mask = wLVItem.mask;
866+ pmLVItem->iItem = wLVItem.iItem;
867+ pmLVItem->iSubItem = wLVItem.iSubItem;
868+ pmLVItem->state = wLVItem.state;
869+ pmLVItem->stateMask = wLVItem.stateMask;
870+ WtoM(pmLVItem->pszText, pmLVItem->cchTextMax, wLVItem.pszText, -1);
871+ TerminateStringM(pmLVItem->pszText, pmLVItem->cchTextMax);
872+ pmLVItem->iImage = wLVItem.iImage;
873+ pmLVItem->lParam = wLVItem.lParam;
874+ pmLVItem->iIndent = wLVItem.iIndent;
875+ break;
876+ default:
877+ r = SendMessageW(hWnd, Msg, wParam, lParam);
878+ break;
879+ }
880+ }
881+ else if(_wcsicmp(ClassName, STATUSCLASSNAMEW) == 0)
882+ {
883+ switch(Msg)
884+ {
885+ case SB_SETTEXTA:
886+ pw0 = DuplicateMtoW((LPCSTR)lParam, -1);
887+ r = SendMessageW(hWnd, SB_SETTEXTW, wParam, (LPARAM)pw0);
888+ break;
889+ default:
890+ r = SendMessageW(hWnd, Msg, wParam, lParam);
891+ break;
892+ }
893+ }
894+ else if(_wcsicmp(ClassName, WC_TREEVIEWW) == 0)
895+ {
896+ switch(Msg)
897+ {
898+ case TVM_GETITEMA:
899+ pmTVItem = (TVITEMEXA*)lParam;
900+ wTVItem.mask = pmTVItem->mask;
901+ wTVItem.hItem = pmTVItem->hItem;
902+ wTVItem.state = pmTVItem->state;
903+ wTVItem.stateMask = pmTVItem->stateMask;
904+ if(pmTVItem->mask & TVIF_TEXT)
905+ {
906+ Size = pmTVItem->cchTextMax * 4;
907+ pw0 = AllocateStringW(Size);
908+ wTVItem.pszText = pw0;
909+ wTVItem.cchTextMax = Size;
910+ }
911+ wTVItem.iImage = pmTVItem->iImage;
912+ wTVItem.iSelectedImage = pmTVItem->iSelectedImage;
913+ wTVItem.cChildren = pmTVItem->cChildren;
914+ wTVItem.lParam = pmTVItem->lParam;
915+ wTVItem.iIntegral = pmTVItem->iIntegral;
916+// wTVItem.uStateEx = pmTVItem->uStateEx;
917+// wTVItem.hwnd = pmTVItem->hwnd;
918+// wTVItem.iExpandedImage = pmTVItem->iExpandedImage;
919+// wTVItem.iReserved = pmTVItem->iReserved;
920+ r = SendMessageW(hWnd, TVM_GETITEMW, wParam, (LPARAM)&wTVItem);
921+ pmTVItem->mask = wTVItem.mask;
922+ pmTVItem->hItem = wTVItem.hItem;
923+ pmTVItem->state = wTVItem.state;
924+ pmTVItem->stateMask = wTVItem.stateMask;
925+ if(pmTVItem->mask & TVIF_TEXT)
926+ {
927+ WtoM(pmTVItem->pszText, pmTVItem->cchTextMax, wTVItem.pszText, -1);
928+ TerminateStringM(pmTVItem->pszText, pmTVItem->cchTextMax);
929+ }
930+ pmTVItem->iImage = wTVItem.iImage;
931+ pmTVItem->iSelectedImage = wTVItem.iSelectedImage;
932+ pmTVItem->cChildren = wTVItem.cChildren;
933+ pmTVItem->lParam = wTVItem.lParam;
934+ pmTVItem->iIntegral = wTVItem.iIntegral;
935+// pmTVItem->uStateEx = wTVItem.uStateEx;
936+// pmTVItem->hwnd = wTVItem.hwnd;
937+// pmTVItem->iExpandedImage = wTVItem.iExpandedImage;
938+// pmTVItem->iReserved = wTVItem.iReserved;
939+ break;
940+ case TVM_INSERTITEMA:
941+ pmTVInsert = (TVINSERTSTRUCTA*)lParam;
942+ wTVInsert.hParent = pmTVInsert->hParent;
943+ wTVInsert.hInsertAfter = pmTVInsert->hInsertAfter;
944+ wTVInsert.itemex.mask = pmTVInsert->itemex.mask;
945+ wTVInsert.itemex.hItem = pmTVInsert->itemex.hItem;
946+ wTVInsert.itemex.state = pmTVInsert->itemex.state;
947+ wTVInsert.itemex.stateMask = pmTVInsert->itemex.stateMask;
948+ if(pmTVInsert->itemex.mask & TVIF_TEXT)
949+ {
950+ pw0 = DuplicateMtoW(pmTVInsert->itemex.pszText, -1);
951+ wTVInsert.itemex.pszText = pw0;
952+ // TODO: cchTextMaxの確認
953+ wTVInsert.itemex.cchTextMax = pmTVInsert->itemex.cchTextMax;
954+ }
955+ wTVInsert.itemex.iImage = pmTVInsert->itemex.iImage;
956+ wTVInsert.itemex.iSelectedImage = pmTVInsert->itemex.iSelectedImage;
957+ wTVInsert.itemex.cChildren = pmTVInsert->itemex.cChildren;
958+ wTVInsert.itemex.lParam = pmTVInsert->itemex.lParam;
959+ wTVInsert.itemex.iIntegral = pmTVInsert->itemex.iIntegral;
960+// wTVInsert.itemex.uStateEx = pmTVInsert->itemex.uStateEx;
961+// wTVInsert.itemex.hwnd = pmTVInsert->itemex.hwnd;
962+// wTVInsert.itemex.iExpandedImage = pmTVInsert->itemex.iExpandedImage;
963+// wTVInsert.itemex.iReserved = pmTVInsert->itemex.iReserved;
964+ r = SendMessageW(hWnd, TVM_INSERTITEMW, wParam, (LPARAM)&wTVInsert);
965+ break;
966+ default:
967+ r = SendMessageW(hWnd, Msg, wParam, lParam);
968+ break;
969+ }
970+ }
971+ else
972+ r = SendMessageW(hWnd, Msg, wParam, lParam);
973+ break;
974+ }
975+END_ROUTINE
976+ FreeDuplicatedString(pw0);
977+ FreeDuplicatedString(pw1);
978+ return r;
979+}
980+
981+LRESULT DefDlgProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
982+{
983+ LRESULT r = 0;
984+START_ROUTINE
985+ // WNDPROCがShift_JIS用であるため
986+ if(IsWindowUnicode(hWnd))
987+ r = DefDlgProcW(hWnd, Msg, wParam, lParam);
988+ else
989+ r = DefDlgProcA(hWnd, Msg, wParam, lParam);
990+END_ROUTINE
991+ return r;
992+}
993+
994+LRESULT SendDlgItemMessageM(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam)
995+{
996+ LRESULT r = 0;
997+START_ROUTINE
998+ r = SendMessageM(GetDlgItem(hDlg, nIDDlgItem), Msg, wParam, lParam);
999+END_ROUTINE
1000+ return r;
1001+}
1002+
1003+BOOL SetWindowTextM(HWND hWnd, LPCSTR lpString)
1004+{
1005+ BOOL r = FALSE;
1006+ wchar_t* pw0 = NULL;
1007+START_ROUTINE
1008+ pw0 = DuplicateMtoW(lpString, -1);
1009+ r = SetWindowTextW(hWnd, pw0);
1010+END_ROUTINE
1011+ FreeDuplicatedString(pw0);
1012+ return r;
1013+}
1014+
1015+UINT DragQueryFileM(HDROP hDrop, UINT iFile, LPSTR lpszFile, UINT cch)
1016+{
1017+ UINT r = 0;
1018+ wchar_t* pw0 = NULL;
1019+START_ROUTINE
1020+ if(iFile == (UINT)-1)
1021+ r = DragQueryFileW(hDrop, iFile, (LPWSTR)lpszFile, cch);
1022+ else
1023+ {
1024+ pw0 = AllocateStringW(cch * 4);
1025+ DragQueryFileW(hDrop, iFile, pw0, cch * 4);
1026+ WtoM(lpszFile, cch, pw0, -1);
1027+ r = TerminateStringM(lpszFile, cch);
1028+ }
1029+END_ROUTINE
1030+ FreeDuplicatedString(pw0);
1031+ return r;
1032+}
1033+
1034+LPSTR GetCommandLineM()
1035+{
1036+ LPSTR r = 0;
1037+ static char* pm0 = NULL;
1038+START_ROUTINE
1039+ if(!pm0)
1040+ pm0 = DuplicateWtoM(GetCommandLineW(), -1);
1041+ r = pm0;
1042+END_ROUTINE
1043+ return r;
1044+}
1045+
1046+DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer)
1047+{
1048+ DWORD r = 0;
1049+ wchar_t* pw0 = NULL;
1050+START_ROUTINE
1051+ // TODO: バッファが不十分な場合に必要なサイズを返す
1052+ pw0 = AllocateStringW(nBufferLength * 4);
1053+ GetCurrentDirectoryW(nBufferLength * 4, pw0);
1054+ WtoM(lpBuffer, nBufferLength, pw0, -1);
1055+ r = TerminateStringM(lpBuffer, nBufferLength);
1056+END_ROUTINE
1057+ FreeDuplicatedString(pw0);
1058+ return r;
1059+}
1060+
1061+BOOL SetCurrentDirectoryM(LPCSTR lpPathName)
1062+{
1063+ BOOL r = FALSE;
1064+ wchar_t* pw0 = NULL;
1065+START_ROUTINE
1066+ pw0 = DuplicateMtoW(lpPathName, -1);
1067+ r = SetCurrentDirectoryW(pw0);
1068+END_ROUTINE
1069+ FreeDuplicatedString(pw0);
1070+ return r;
1071+}
1072+
1073+DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer)
1074+{
1075+ DWORD r = 0;
1076+ wchar_t* pw0 = NULL;
1077+START_ROUTINE
1078+ pw0 = AllocateStringW(nBufferLength * 4);
1079+ GetTempPathW(nBufferLength * 4, pw0);
1080+ WtoM(lpBuffer, nBufferLength, pw0, -1);
1081+ r = TerminateStringM(lpBuffer, nBufferLength);
1082+END_ROUTINE
1083+ FreeDuplicatedString(pw0);
1084+ return r;
1085+}
1086+
1087+DWORD GetFileAttributesM(LPCSTR lpFileName)
1088+{
1089+ DWORD r = FALSE;
1090+ wchar_t* pw0 = NULL;
1091+START_ROUTINE
1092+ pw0 = DuplicateMtoW(lpFileName, -1);
1093+ r = GetFileAttributesW(pw0);
1094+END_ROUTINE
1095+ FreeDuplicatedString(pw0);
1096+ return r;
1097+}
1098+
1099+DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize)
1100+{
1101+ DWORD r = 0;
1102+ wchar_t* pw0 = NULL;
1103+START_ROUTINE
1104+ pw0 = AllocateStringW(nSize * 4);
1105+ GetModuleFileNameW(hModule, pw0, nSize * 4);
1106+ WtoM(lpFilename, nSize, pw0, -1);
1107+ r = TerminateStringM(lpFilename, nSize);
1108+END_ROUTINE
1109+ FreeDuplicatedString(pw0);
1110+ return r;
1111+}
1112+
1113+LSTATUS RegOpenKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
1114+{
1115+ LSTATUS r = 0;
1116+ wchar_t* pw0 = NULL;
1117+START_ROUTINE
1118+ pw0 = DuplicateMtoW(lpSubKey, -1);
1119+ r = RegOpenKeyExW(hKey, pw0, ulOptions, samDesired, phkResult);
1120+END_ROUTINE
1121+ FreeDuplicatedString(pw0);
1122+ return r;
1123+}
1124+
1125+LSTATUS RegCreateKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition)
1126+{
1127+ LSTATUS r = 0;
1128+ wchar_t* pw0 = NULL;
1129+ wchar_t* pw1 = NULL;
1130+START_ROUTINE
1131+ pw0 = DuplicateMtoW(lpSubKey, -1);
1132+ pw1 = DuplicateMtoW(lpClass, -1);
1133+ r = RegCreateKeyExW(hKey, pw0, Reserved, pw1, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition);
1134+END_ROUTINE
1135+ FreeDuplicatedString(pw0);
1136+ FreeDuplicatedString(pw1);
1137+ return r;
1138+}
1139+
1140+LSTATUS RegDeleteValueM(HKEY hKey, LPCSTR lpValueName)
1141+{
1142+ LSTATUS r = 0;
1143+ wchar_t* pw0 = NULL;
1144+START_ROUTINE
1145+ pw0 = DuplicateMtoW(lpValueName, -1);
1146+ r = RegDeleteValueW(hKey, pw0);
1147+END_ROUTINE
1148+ FreeDuplicatedString(pw0);
1149+ return r;
1150+}
1151+
1152+LSTATUS RegQueryValueExM(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
1153+{
1154+ LSTATUS r = 0;
1155+ wchar_t* pw0 = NULL;
1156+ wchar_t* pw1 = NULL;
1157+ DWORD dwType;
1158+ DWORD wcbData;
1159+START_ROUTINE
1160+ pw0 = DuplicateMtoW(lpValueName, -1);
1161+ if(RegQueryValueExW(hKey, pw0, NULL, &dwType, NULL, 0) == ERROR_SUCCESS)
1162+ {
1163+ switch(dwType)
1164+ {
1165+ case REG_SZ:
1166+ case REG_EXPAND_SZ:
1167+ case REG_MULTI_SZ:
1168+ if(lpcbData)
1169+ {
1170+ pw1 = AllocateStringW(*lpcbData / sizeof(char) * 4);
1171+ wcbData = *lpcbData / sizeof(char) * 4;
1172+ r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, (LPBYTE)pw1, &wcbData);
1173+ if(lpData)
1174+ *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t));
1175+ else
1176+ *lpcbData = sizeof(char) * WtoM(NULL, 0, pw1, wcbData / sizeof(wchar_t));
1177+ }
1178+ break;
1179+ default:
1180+ r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, lpData, lpcbData);
1181+ break;
1182+ }
1183+ }
1184+ else
1185+ r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, lpData, lpcbData);
1186+END_ROUTINE
1187+ FreeDuplicatedString(pw0);
1188+ FreeDuplicatedString(pw1);
1189+ return r;
1190+}
1191+
1192+LSTATUS RegSetValueExM(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData)
1193+{
1194+ LSTATUS r = 0;
1195+ wchar_t* pw0 = NULL;
1196+ wchar_t* pw1 = NULL;
1197+ DWORD wcbData;
1198+START_ROUTINE
1199+ pw0 = DuplicateMtoW(lpValueName, -1);
1200+ switch(dwType)
1201+ {
1202+ case REG_SZ:
1203+ case REG_EXPAND_SZ:
1204+ case REG_MULTI_SZ:
1205+ wcbData = MtoW(NULL, 0, (char*)lpData, cbData / sizeof(char));
1206+ pw1 = AllocateStringW(wcbData);
1207+ MtoW(pw1, wcbData, (char*)lpData, cbData / sizeof(char));
1208+ wcbData = sizeof(wchar_t) * wcbData;
1209+ lpData = (BYTE*)pw1;
1210+ cbData = wcbData;
1211+ break;
1212+ }
1213+ r = RegSetValueExW(hKey, pw0, Reserved, dwType, lpData, cbData);
1214+END_ROUTINE
1215+ FreeDuplicatedString(pw0);
1216+ FreeDuplicatedString(pw1);
1217+ return r;
1218+}
1219+
1220+BOOL TextOutM(HDC hdc, int x, int y, LPCSTR lpString, int c)
1221+{
1222+ BOOL r = FALSE;
1223+ wchar_t* pw0 = NULL;
1224+START_ROUTINE
1225+ pw0 = DuplicateMtoW(lpString, c);
1226+ r = TextOutW(hdc, x, y, pw0, wcslen(pw0));
1227+END_ROUTINE
1228+ FreeDuplicatedString(pw0);
1229+ return r;
1230+}
1231+
1232+BOOL GetTextExtentPoint32M(HDC hdc, LPCSTR lpString, int c, LPSIZE psizl)
1233+{
1234+ BOOL r = FALSE;
1235+ wchar_t* pw0 = NULL;
1236+START_ROUTINE
1237+ pw0 = DuplicateMtoW(lpString, c);
1238+ r = GetTextExtentPoint32W(hdc, pw0, wcslen(pw0), psizl);
1239+END_ROUTINE
1240+ FreeDuplicatedString(pw0);
1241+ return r;
1242+}
1243+
1244+INT_PTR PropertySheetM(LPCPROPSHEETHEADERA v0)
1245+{
1246+ INT_PTR r = 0;
1247+ PROPSHEETHEADERW a0;
1248+ PROPSHEETPAGEW* pwPage;
1249+ UINT i;
1250+START_ROUTINE
1251+ a0.dwSize = sizeof(PROPSHEETHEADERW);
1252+ a0.dwFlags = v0->dwFlags;
1253+ a0.hwndParent = v0->hwndParent;
1254+ a0.hInstance = v0->hInstance;
1255+ if(v0->dwFlags & PSH_USEICONID)
1256+ a0.pszIcon = DuplicateMtoW(v0->pszIcon, -1);
1257+ else
1258+ a0.hIcon = v0->hIcon;
1259+ a0.pszCaption = DuplicateMtoW(v0->pszCaption, -1);
1260+ a0.nPages = v0->nPages;
1261+ if(v0->dwFlags & PSH_USEPSTARTPAGE)
1262+ a0.pStartPage = DuplicateMtoW(v0->pStartPage, -1);
1263+ else
1264+ a0.nStartPage = v0->nStartPage;
1265+ if(v0->dwFlags & PSH_PROPSHEETPAGE)
1266+ {
1267+ if(v0->ppsp && (pwPage = (PROPSHEETPAGEW*)malloc(sizeof(PROPSHEETPAGEW) * v0->nPages)))
1268+ {
1269+ for(i = 0; i < v0->nPages; i++)
1270+ {
1271+ pwPage[i].dwSize = sizeof(PROPSHEETPAGEW);
1272+ pwPage[i].dwFlags = v0->ppsp[i].dwFlags;
1273+ pwPage[i].hInstance = v0->ppsp[i].hInstance;
1274+ if(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT)
1275+ pwPage[i].pResource = v0->ppsp[i].pResource;
1276+ else
1277+ pwPage[i].pszTemplate = DuplicateMtoW(v0->ppsp[i].pszTemplate, -1);
1278+ if(v0->ppsp[i].dwFlags & PSP_USEICONID)
1279+ pwPage[i].pszIcon = DuplicateMtoW(v0->ppsp[i].pszIcon, -1);
1280+ else
1281+ pwPage[i].hIcon = v0->ppsp[i].hIcon;
1282+ if(v0->ppsp[i].dwFlags & PSP_USETITLE)
1283+ pwPage[i].pszTitle = DuplicateMtoW(v0->ppsp[i].pszTitle, -1);
1284+ pwPage[i].pfnDlgProc = v0->ppsp[i].pfnDlgProc;
1285+ pwPage[i].lParam = v0->ppsp[i].lParam;
1286+ // TODO: pfnCallback
1287+ pwPage[i].pfnCallback = (LPFNPSPCALLBACKW)v0->ppsp[i].pfnCallback;
1288+ pwPage[i].pcRefParent = v0->ppsp[i].pcRefParent;
1289+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
1290+ pwPage[i].pszHeaderTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderTitle, -1);
1291+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
1292+ pwPage[i].pszHeaderSubTitle = DuplicateMtoW(v0->ppsp[i].pszHeaderSubTitle, -1);
1293+ }
1294+ }
1295+ else
1296+ pwPage = NULL;
1297+ a0.ppsp = pwPage;
1298+ }
1299+ else
1300+ a0.phpage = v0->phpage;
1301+ a0.pfnCallback = v0->pfnCallback;
1302+ if(v0->dwFlags & PSH_USEHBMWATERMARK)
1303+ a0.hbmWatermark = v0->hbmWatermark;
1304+ else
1305+ a0.pszbmWatermark = DuplicateMtoW(v0->pszbmWatermark, -1);
1306+ r = PropertySheetW(&a0);
1307+ if(a0.dwFlags & PSH_USEICONID)
1308+ FreeDuplicatedString((void*)a0.pszIcon);
1309+ FreeDuplicatedString((void*)a0.pszCaption);
1310+ if(v0->dwFlags & PSH_USEPSTARTPAGE)
1311+ FreeDuplicatedString((void*)a0.pStartPage);
1312+ if(v0->dwFlags & PSH_PROPSHEETPAGE)
1313+ {
1314+ if(pwPage)
1315+ {
1316+ for(i = 0; i < v0->nPages; i++)
1317+ {
1318+ if(!(v0->ppsp[i].dwFlags & PSP_DLGINDIRECT))
1319+ FreeDuplicatedString((void*)pwPage[i].pszTemplate);
1320+ if(v0->ppsp[i].dwFlags & PSP_USEICONID)
1321+ FreeDuplicatedString((void*)pwPage[i].pszIcon);
1322+ if(v0->ppsp[i].dwFlags & PSP_USETITLE)
1323+ FreeDuplicatedString((void*)pwPage[i].pszTitle);
1324+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERTITLE)
1325+ FreeDuplicatedString((void*)pwPage[i].pszHeaderTitle);
1326+ if(v0->ppsp[i].dwFlags & PSP_USEHEADERSUBTITLE)
1327+ FreeDuplicatedString((void*)pwPage[i].pszHeaderSubTitle);
1328+ }
1329+ free(pwPage);
1330+ }
1331+ }
1332+ if(!(v0->dwFlags & PSH_USEHBMWATERMARK))
1333+ FreeDuplicatedString((void*)a0.pszbmWatermark);
1334+END_ROUTINE
1335+ return r;
1336+}
1337+
1338+BOOL GetOpenFileNameM(LPOPENFILENAMEA v0)
1339+{
1340+ BOOL r = FALSE;
1341+ wchar_t* pw0 = NULL;
1342+ wchar_t* pw1 = NULL;
1343+ wchar_t* pw2 = NULL;
1344+ wchar_t* pw3 = NULL;
1345+ wchar_t* pw4 = NULL;
1346+ wchar_t* pw5 = NULL;
1347+ wchar_t* pw6 = NULL;
1348+ wchar_t* pw7 = NULL;
1349+ wchar_t* pw8 = NULL;
1350+ wchar_t* pw9 = NULL;
1351+ OPENFILENAMEW wofn;
1352+START_ROUTINE
1353+ wofn.lStructSize = sizeof(OPENFILENAMEW);
1354+ wofn.hwndOwner = v0->hwndOwner;
1355+ wofn.hInstance = v0->hInstance;
1356+ pw0 = DuplicateMtoWMultiString(v0->lpstrFilter);
1357+ wofn.lpstrFilter = pw0;
1358+ pw1 = DuplicateMtoWBuffer(v0->lpstrCustomFilter, -1, v0->nMaxCustFilter * 4);
1359+ wofn.lpstrCustomFilter = pw1;
1360+ wofn.nMaxCustFilter = v0->nMaxCustFilter * 4;
1361+ wofn.nFilterIndex = v0->nFilterIndex;
1362+ pw2 = DuplicateMtoWMultiStringBuffer(v0->lpstrFile, v0->nMaxFile * 4);
1363+ wofn.lpstrFile = pw2;
1364+ wofn.nMaxFile = v0->nMaxFile * 4;
1365+ pw3 = DuplicateMtoWBuffer(v0->lpstrFileTitle, -1, v0->nMaxFileTitle * 4);
1366+ wofn.lpstrFileTitle = pw3;
1367+ wofn.nMaxFileTitle = v0->nMaxFileTitle * 4;
1368+ pw4 = DuplicateMtoW(v0->lpstrInitialDir, -1);
1369+ wofn.lpstrInitialDir = pw4;
1370+ pw5 = DuplicateMtoW(v0->lpstrTitle, -1);
1371+ wofn.lpstrTitle = pw5;
1372+ wofn.Flags = v0->Flags;
1373+ wofn.nFileOffset = MtoW(NULL, 0, v0->lpstrFile, v0->nFileOffset);
1374+ wofn.nFileExtension = MtoW(NULL, 0, v0->lpstrFile, v0->nFileExtension);
1375+ pw6 = DuplicateMtoW(v0->lpstrDefExt, -1);
1376+ wofn.lpstrDefExt = pw6;
1377+ wofn.lCustData = v0->lCustData;
1378+ wofn.lpfnHook = v0->lpfnHook;
1379+ wofn.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);
1380+ wofn.pvReserved = v0->pvReserved;
1381+ wofn.FlagsEx = v0->FlagsEx;
1382+ r = GetOpenFileNameW(&wofn);
1383+ WtoM(v0->lpstrFile, v0->nMaxFile, wofn.lpstrFile, -1);
1384+ TerminateStringM(v0->lpstrFile, v0->nMaxFile);
1385+ v0->nFileOffset = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileOffset);
1386+ v0->nFileExtension = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileExtension);
1387+END_ROUTINE
1388+ FreeDuplicatedString(pw0);
1389+ FreeDuplicatedString(pw1);
1390+ FreeDuplicatedString(pw2);
1391+ FreeDuplicatedString(pw3);
1392+ FreeDuplicatedString(pw4);
1393+ FreeDuplicatedString(pw5);
1394+ FreeDuplicatedString(pw6);
1395+ return r;
1396+}
1397+
1398+BOOL GetSaveFileNameM(LPOPENFILENAMEA v0)
1399+{
1400+ BOOL r = FALSE;
1401+ wchar_t* pw0 = NULL;
1402+ wchar_t* pw1 = NULL;
1403+ wchar_t* pw2 = NULL;
1404+ wchar_t* pw3 = NULL;
1405+ wchar_t* pw4 = NULL;
1406+ wchar_t* pw5 = NULL;
1407+ wchar_t* pw6 = NULL;
1408+ wchar_t* pw7 = NULL;
1409+ wchar_t* pw8 = NULL;
1410+ wchar_t* pw9 = NULL;
1411+ OPENFILENAMEW wofn;
1412+START_ROUTINE
1413+ wofn.lStructSize = sizeof(OPENFILENAMEW);
1414+ wofn.hwndOwner = v0->hwndOwner;
1415+ wofn.hInstance = v0->hInstance;
1416+ pw0 = DuplicateMtoWMultiString(v0->lpstrFilter);
1417+ wofn.lpstrFilter = pw0;
1418+ pw1 = DuplicateMtoWBuffer(v0->lpstrCustomFilter, -1, v0->nMaxCustFilter * 4);
1419+ wofn.lpstrCustomFilter = pw1;
1420+ wofn.nMaxCustFilter = v0->nMaxCustFilter * 4;
1421+ wofn.nFilterIndex = v0->nFilterIndex;
1422+ pw2 = DuplicateMtoWMultiStringBuffer(v0->lpstrFile, v0->nMaxFile * 4);
1423+ wofn.lpstrFile = pw2;
1424+ wofn.nMaxFile = v0->nMaxFile * 4;
1425+ pw3 = DuplicateMtoWBuffer(v0->lpstrFileTitle, -1, v0->nMaxFileTitle * 4);
1426+ wofn.lpstrFileTitle = pw3;
1427+ wofn.nMaxFileTitle = v0->nMaxFileTitle * 4;
1428+ pw4 = DuplicateMtoW(v0->lpstrInitialDir, -1);
1429+ wofn.lpstrInitialDir = pw4;
1430+ pw5 = DuplicateMtoW(v0->lpstrTitle, -1);
1431+ wofn.lpstrTitle = pw5;
1432+ wofn.Flags = v0->Flags;
1433+ wofn.nFileOffset = MtoW(NULL, 0, v0->lpstrFile, v0->nFileOffset);
1434+ wofn.nFileExtension = MtoW(NULL, 0, v0->lpstrFile, v0->nFileExtension);
1435+ pw6 = DuplicateMtoW(v0->lpstrDefExt, -1);
1436+ wofn.lpstrDefExt = pw6;
1437+ wofn.lCustData = v0->lCustData;
1438+ wofn.lpfnHook = v0->lpfnHook;
1439+ wofn.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);
1440+ wofn.pvReserved = v0->pvReserved;
1441+ wofn.FlagsEx = v0->FlagsEx;
1442+ r = GetSaveFileNameW(&wofn);
1443+ WtoM(v0->lpstrFile, v0->nMaxFile, wofn.lpstrFile, -1);
1444+ TerminateStringM(v0->lpstrFile, v0->nMaxFile);
1445+ v0->nFileOffset = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileOffset);
1446+ v0->nFileExtension = WtoM(NULL, 0, wofn.lpstrFile, wofn.nFileExtension);
1447+END_ROUTINE
1448+ FreeDuplicatedString(pw0);
1449+ FreeDuplicatedString(pw1);
1450+ FreeDuplicatedString(pw2);
1451+ FreeDuplicatedString(pw3);
1452+ FreeDuplicatedString(pw4);
1453+ FreeDuplicatedString(pw5);
1454+ FreeDuplicatedString(pw6);
1455+ return r;
1456+}
1457+
1458+HWND HtmlHelpM(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData)
1459+{
1460+ HWND r = NULL;
1461+ wchar_t* pw0 = NULL;
1462+START_ROUTINE
1463+ pw0 = DuplicateMtoW(pszFile, -1);
1464+ r = HtmlHelpW(hwndCaller, pw0, uCommand, dwData);
1465+END_ROUTINE
1466+ FreeDuplicatedString(pw0);
1467+ return r;
1468+}
1469+
1470+BOOL CreateProcessM(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
1471+{
1472+ BOOL r = FALSE;
1473+ wchar_t* pw0 = NULL;
1474+ wchar_t* pw1 = NULL;
1475+ wchar_t* pw2 = NULL;
1476+ wchar_t* pw3 = NULL;
1477+ wchar_t* pw4 = NULL;
1478+ wchar_t* pw5 = NULL;
1479+ STARTUPINFOW wStartupInfo;
1480+START_ROUTINE
1481+ pw0 = DuplicateMtoW(lpApplicationName, -1);
1482+ pw1 = DuplicateMtoWBuffer(lpCommandLine, -1, (strlen(lpCommandLine) + 1) * 4);
1483+ pw2 = DuplicateMtoW(lpCurrentDirectory, -1);
1484+ wStartupInfo.cb = sizeof(LPSTARTUPINFOW);
1485+ pw3 = DuplicateMtoW(lpStartupInfo->lpReserved, -1);
1486+ wStartupInfo.lpReserved = pw3;
1487+ pw4 = DuplicateMtoW(lpStartupInfo->lpDesktop, -1);
1488+ wStartupInfo.lpDesktop = pw4;
1489+ pw5 = DuplicateMtoW(lpStartupInfo->lpTitle, -1);
1490+ wStartupInfo.lpTitle = pw5;
1491+ wStartupInfo.dwX = lpStartupInfo->dwX;
1492+ wStartupInfo.dwY = lpStartupInfo->dwY;
1493+ wStartupInfo.dwXSize = lpStartupInfo->dwXSize;
1494+ wStartupInfo.dwYSize = lpStartupInfo->dwYSize;
1495+ wStartupInfo.dwXCountChars = lpStartupInfo->dwXCountChars;
1496+ wStartupInfo.dwYCountChars = lpStartupInfo->dwYCountChars;
1497+ wStartupInfo.dwFillAttribute = lpStartupInfo->dwFillAttribute;
1498+ wStartupInfo.dwFlags = lpStartupInfo->dwFlags;
1499+ wStartupInfo.wShowWindow = lpStartupInfo->wShowWindow;
1500+ wStartupInfo.cbReserved2 = lpStartupInfo->cbReserved2;
1501+ wStartupInfo.lpReserved2 = lpStartupInfo->lpReserved2;
1502+ wStartupInfo.hStdInput = lpStartupInfo->hStdInput;
1503+ wStartupInfo.hStdOutput = lpStartupInfo->hStdOutput;
1504+ wStartupInfo.hStdError = lpStartupInfo->hStdError;
1505+ r = CreateProcessW(pw0, pw1, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, pw2, &wStartupInfo, lpProcessInformation);
1506+ WtoM(lpCommandLine, strlen(lpCommandLine) + 1, pw1, -1);
1507+END_ROUTINE
1508+ FreeDuplicatedString(pw0);
1509+ FreeDuplicatedString(pw1);
1510+ FreeDuplicatedString(pw2);
1511+ FreeDuplicatedString(pw3);
1512+ FreeDuplicatedString(pw4);
1513+ FreeDuplicatedString(pw5);
1514+ return r;
1515+}
1516+
1517+HINSTANCE FindExecutableM(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
1518+{
1519+ HINSTANCE r = NULL;
1520+ wchar_t* pw0 = NULL;
1521+ wchar_t* pw1 = NULL;
1522+ wchar_t* pw2 = NULL;
1523+ wchar_t* pw3 = NULL;
1524+START_ROUTINE
1525+ pw0 = DuplicateMtoW(lpFile, -1);
1526+ pw1 = DuplicateMtoW(lpDirectory, -1);
1527+ pw2 = AllocateStringW(MAX_PATH * 4);
1528+ r = FindExecutableW(pw0, pw1, pw2);
1529+ // バッファ長不明のためオーバーランの可能性あり
1530+ WtoM(lpResult, MAX_PATH, pw2, -1);
1531+ TerminateStringM(lpResult, MAX_PATH);
1532+END_ROUTINE
1533+ FreeDuplicatedString(pw0);
1534+ FreeDuplicatedString(pw1);
1535+ FreeDuplicatedString(pw2);
1536+ FreeDuplicatedString(pw3);
1537+ return r;
1538+}
1539+
1540+HINSTANCE ShellExecuteM(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd)
1541+{
1542+ HINSTANCE r = NULL;
1543+ wchar_t* pw0 = NULL;
1544+ wchar_t* pw1 = NULL;
1545+ wchar_t* pw2 = NULL;
1546+ wchar_t* pw3 = NULL;
1547+START_ROUTINE
1548+ pw0 = DuplicateMtoW(lpOperation, -1);
1549+ pw1 = DuplicateMtoW(lpFile, -1);
1550+ pw2 = DuplicateMtoW(lpParameters, -1);
1551+ pw3 = DuplicateMtoW(lpDirectory, -1);
1552+ r = ShellExecuteW(hwnd, pw0, pw1, pw2, pw3, nShowCmd);
1553+END_ROUTINE
1554+ FreeDuplicatedString(pw0);
1555+ FreeDuplicatedString(pw1);
1556+ FreeDuplicatedString(pw2);
1557+ FreeDuplicatedString(pw3);
1558+ return r;
1559+}
1560+
1561+PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi)
1562+{
1563+ PIDLIST_ABSOLUTE r = NULL;
1564+ wchar_t* pw0 = NULL;
1565+ wchar_t* pw1 = NULL;
1566+ BROWSEINFOW wbi;
1567+START_ROUTINE
1568+ wbi.hwndOwner = lpbi->hwndOwner;
1569+ wbi.pidlRoot = lpbi->pidlRoot;
1570+ pw0 = DuplicateMtoWBuffer(lpbi->pszDisplayName, -1, MAX_PATH * 4);
1571+ wbi.pszDisplayName = pw0;
1572+ pw1 = DuplicateMtoW(lpbi->lpszTitle, -1);
1573+ wbi.lpszTitle = pw1;
1574+ wbi.ulFlags = lpbi->ulFlags;
1575+ // TODO: lpfn
1576+ wbi.lpfn = lpbi->lpfn;
1577+ wbi.lParam = lpbi->lParam;
1578+ wbi.iImage = lpbi->iImage;
1579+ r = SHBrowseForFolderW(&wbi);
1580+ // バッファ長不明のためオーバーランの可能性あり
1581+ WtoM(lpbi->pszDisplayName, MAX_PATH, wbi.pszDisplayName, -1);
1582+ lpbi->iImage = wbi.iImage;
1583+END_ROUTINE
1584+ FreeDuplicatedString(pw0);
1585+ FreeDuplicatedString(pw1);
1586+ return r;
1587+}
1588+
1589+BOOL SHGetPathFromIDListM(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath)
1590+{
1591+ BOOL r = FALSE;
1592+ wchar_t* pw0 = NULL;
1593+START_ROUTINE
1594+ pw0 = AllocateStringW(MAX_PATH * 4);
1595+ r = SHGetPathFromIDListW(pidl, pw0);
1596+ // バッファ長不明のためオーバーランの可能性あり
1597+ WtoM(pszPath, MAX_PATH, pw0, -1);
1598+ TerminateStringM(pszPath, MAX_PATH);
1599+END_ROUTINE
1600+ FreeDuplicatedString(pw0);
1601+ return r;
1602+}
1603+
1604+int SHFileOperationM(LPSHFILEOPSTRUCTA lpFileOp)
1605+{
1606+ int r = 0;
1607+ wchar_t* pw0 = NULL;
1608+ wchar_t* pw1 = NULL;
1609+ wchar_t* pw2 = NULL;
1610+ SHFILEOPSTRUCTW wFileOp;
1611+START_ROUTINE
1612+ wFileOp.hwnd = lpFileOp->hwnd;
1613+ wFileOp.wFunc = lpFileOp->wFunc;
1614+ pw0 = DuplicateMtoWMultiString(lpFileOp->pFrom);
1615+ wFileOp.pFrom = pw0;
1616+ pw1 = DuplicateMtoWMultiString(lpFileOp->pTo);
1617+ wFileOp.pTo = pw1;
1618+ wFileOp.fFlags = lpFileOp->fFlags;
1619+ wFileOp.fAnyOperationsAborted = lpFileOp->fAnyOperationsAborted;
1620+ wFileOp.hNameMappings = lpFileOp->hNameMappings;
1621+ if(lpFileOp->fFlags & FOF_SIMPLEPROGRESS)
1622+ pw2 = DuplicateMtoW(lpFileOp->lpszProgressTitle, -1);
1623+ r = SHFileOperationW(&wFileOp);
1624+ lpFileOp->fAnyOperationsAborted = wFileOp.fAnyOperationsAborted;
1625+END_ROUTINE
1626+ FreeDuplicatedString(pw0);
1627+ FreeDuplicatedString(pw1);
1628+ FreeDuplicatedString(pw2);
1629+ return r;
1630+}
1631+
1632+BOOL AppendMenuM(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem)
1633+{
1634+ int r = 0;
1635+ wchar_t* pw0 = NULL;
1636+START_ROUTINE
1637+ if(uFlags & (MF_BITMAP | MF_OWNERDRAW))
1638+ r = AppendMenuW(hMenu, uFlags, uIDNewItem, (LPCWSTR)lpNewItem);
1639+ else
1640+ {
1641+ pw0 = DuplicateMtoW(lpNewItem, -1);
1642+ r = AppendMenuW(hMenu, uFlags, uIDNewItem, pw0);
1643+ }
1644+END_ROUTINE
1645+ FreeDuplicatedString(pw0);
1646+ return r;
1647+}
1648+
1649+BOOL GetMenuItemInfoM(HMENU hmenu, UINT item, BOOL fByPosition, LPMENUITEMINFOA lpmii)
1650+{
1651+ BOOL r = FALSE;
1652+ wchar_t* pw0 = NULL;
1653+ MENUITEMINFOW wmii;
1654+START_ROUTINE
1655+ wmii.cbSize = sizeof(MENUITEMINFOW);
1656+ wmii.fMask = lpmii->fMask;
1657+ wmii.fType = lpmii->fType;
1658+ wmii.fState = lpmii->fState;
1659+ wmii.wID = lpmii->wID;
1660+ wmii.hSubMenu = lpmii->hSubMenu;
1661+ wmii.hbmpChecked = lpmii->hbmpChecked;
1662+ wmii.hbmpUnchecked = lpmii->hbmpUnchecked;
1663+ wmii.dwItemData = lpmii->dwItemData;
1664+ if(lpmii->fMask & MIIM_TYPE)
1665+ {
1666+ pw0 = DuplicateMtoWBuffer(lpmii->dwTypeData, -1, lpmii->cch * 4);
1667+ wmii.dwTypeData = pw0;
1668+ wmii.cch = lpmii->cch * 4;
1669+ }
1670+ wmii.hbmpItem = lpmii->hbmpItem;
1671+ r = GetMenuItemInfoW(hmenu, item, fByPosition, &wmii);
1672+ lpmii->fType = wmii.fType;
1673+ lpmii->fState = wmii.fState;
1674+ lpmii->wID = wmii.wID;
1675+ lpmii->hSubMenu = wmii.hSubMenu;
1676+ lpmii->hbmpChecked = wmii.hbmpChecked;
1677+ lpmii->hbmpUnchecked = wmii.hbmpUnchecked;
1678+ lpmii->dwItemData = wmii.dwItemData;
1679+ WtoM(lpmii->dwTypeData, lpmii->cch, wmii.dwTypeData, -1);
1680+ TerminateStringM(lpmii->dwTypeData, lpmii->cch);
1681+END_ROUTINE
1682+ FreeDuplicatedString(pw0);
1683+ return r;
1684+}
1685+
1686+HFONT CreateFontIndirectM(CONST LOGFONTA *lplf)
1687+{
1688+ HFONT r = NULL;
1689+ LOGFONTW wlf;
1690+START_ROUTINE
1691+ wlf.lfHeight = lplf->lfHeight;
1692+ wlf.lfWidth = lplf->lfWidth;
1693+ wlf.lfEscapement = lplf->lfEscapement;
1694+ wlf.lfOrientation = lplf->lfOrientation;
1695+ wlf.lfWeight = lplf->lfWeight;
1696+ wlf.lfItalic = lplf->lfItalic;
1697+ wlf.lfUnderline = lplf->lfUnderline;
1698+ wlf.lfStrikeOut = lplf->lfStrikeOut;
1699+ wlf.lfCharSet = lplf->lfCharSet;
1700+ wlf.lfOutPrecision = lplf->lfOutPrecision;
1701+ wlf.lfClipPrecision = lplf->lfClipPrecision;
1702+ wlf.lfQuality = lplf->lfQuality;
1703+ wlf.lfPitchAndFamily = lplf->lfPitchAndFamily;
1704+ MtoW(wlf.lfFaceName, LF_FACESIZE, lplf->lfFaceName, -1);
1705+ TerminateStringW(wlf.lfFaceName, LF_FACESIZE);
1706+ r = CreateFontIndirect(&wlf);
1707+END_ROUTINE
1708+ return r;
1709+}
1710+
1711+BOOL ChooseFontM(LPCHOOSEFONTA v0)
1712+{
1713+ BOOL r = FALSE;
1714+ wchar_t* pw0 = NULL;
1715+ CHOOSEFONTW a0;
1716+ LOGFONTW* pwlf;
1717+START_ROUTINE
1718+ a0.lStructSize = sizeof(CHOOSEFONTW);
1719+ a0.hwndOwner = v0->hwndOwner;
1720+ a0.hDC = v0->hDC;
1721+ if(v0->lpLogFont && (pwlf = (LOGFONTW*)malloc(sizeof(LOGFONTW))))
1722+ {
1723+ pwlf->lfHeight = v0->lpLogFont->lfHeight;
1724+ pwlf->lfWidth = v0->lpLogFont->lfWidth;
1725+ pwlf->lfEscapement = v0->lpLogFont->lfEscapement;
1726+ pwlf->lfOrientation = v0->lpLogFont->lfOrientation;
1727+ pwlf->lfWeight = v0->lpLogFont->lfWeight;
1728+ pwlf->lfItalic = v0->lpLogFont->lfItalic;
1729+ pwlf->lfUnderline = v0->lpLogFont->lfUnderline;
1730+ pwlf->lfStrikeOut = v0->lpLogFont->lfStrikeOut;
1731+ pwlf->lfCharSet = v0->lpLogFont->lfCharSet;
1732+ pwlf->lfOutPrecision = v0->lpLogFont->lfOutPrecision;
1733+ pwlf->lfClipPrecision = v0->lpLogFont->lfClipPrecision;
1734+ pwlf->lfQuality = v0->lpLogFont->lfQuality;
1735+ pwlf->lfPitchAndFamily = v0->lpLogFont->lfPitchAndFamily;
1736+ MtoW(pwlf->lfFaceName, LF_FACESIZE, v0->lpLogFont->lfFaceName, -1);
1737+ TerminateStringW(pwlf->lfFaceName, LF_FACESIZE);
1738+ }
1739+ else
1740+ pwlf = NULL;
1741+ a0.lpLogFont = pwlf;
1742+ a0.iPointSize = v0->iPointSize;
1743+ a0.Flags = v0->Flags;
1744+ a0.rgbColors = v0->rgbColors;
1745+ a0.lCustData = v0->lCustData;
1746+ a0.lpfnHook = v0->lpfnHook;
1747+ a0.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);
1748+ a0.hInstance = v0->hInstance;
1749+ a0.lpszStyle = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4);
1750+ a0.nFontType = v0->nFontType;
1751+ a0.nSizeMin = v0->nSizeMin;
1752+ a0.nSizeMax = v0->nSizeMax;
1753+ r = ChooseFontW(&a0);
1754+ if(v0->lpLogFont)
1755+ {
1756+ v0->lpLogFont->lfHeight = pwlf->lfHeight;
1757+ v0->lpLogFont->lfWidth = pwlf->lfWidth;
1758+ v0->lpLogFont->lfEscapement = pwlf->lfEscapement;
1759+ v0->lpLogFont->lfOrientation = pwlf->lfOrientation;
1760+ v0->lpLogFont->lfWeight = pwlf->lfWeight;
1761+ v0->lpLogFont->lfItalic = pwlf->lfItalic;
1762+ v0->lpLogFont->lfUnderline = pwlf->lfUnderline;
1763+ v0->lpLogFont->lfStrikeOut = pwlf->lfStrikeOut;
1764+ v0->lpLogFont->lfCharSet = pwlf->lfCharSet;
1765+ v0->lpLogFont->lfOutPrecision = pwlf->lfOutPrecision;
1766+ v0->lpLogFont->lfClipPrecision = pwlf->lfClipPrecision;
1767+ v0->lpLogFont->lfQuality = pwlf->lfQuality;
1768+ v0->lpLogFont->lfPitchAndFamily = pwlf->lfPitchAndFamily;
1769+ WtoM(v0->lpLogFont->lfFaceName, LF_FACESIZE, pwlf->lfFaceName, -1);
1770+ TerminateStringM(v0->lpLogFont->lfFaceName, LF_FACESIZE);
1771+ }
1772+ v0->rgbColors = a0.rgbColors;
1773+ WtoM(v0->lpszStyle, LF_FACESIZE, a0.lpszStyle, -1);
1774+ TerminateStringM(v0->lpszStyle, LF_FACESIZE);
1775+ v0->nFontType = a0.nFontType;
1776+ if(pwlf)
1777+ free(pwlf);
1778+ FreeDuplicatedString((void*)a0.lpTemplateName);
1779+ FreeDuplicatedString(a0.lpszStyle);
1780+END_ROUTINE
1781+ FreeDuplicatedString(pw0);
1782+ return r;
1783+}
1784+
1785+INT_PTR DialogBoxParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
1786+{
1787+ INT_PTR r = 0;
1788+ wchar_t* pw0 = NULL;
1789+START_ROUTINE
1790+ pw0 = DuplicateMtoW(lpTemplateName, -1);
1791+ r = DialogBoxParamW(hInstance, pw0, hWndParent, lpDialogFunc, dwInitParam);
1792+END_ROUTINE
1793+ FreeDuplicatedString(pw0);
1794+ return r;
1795+}
1796+
1797+HWND CreateDialogParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam)
1798+{
1799+ HWND r = NULL;
1800+ wchar_t* pw0 = NULL;
1801+START_ROUTINE
1802+ pw0 = DuplicateMtoW(lpTemplateName, -1);
1803+ r = CreateDialogParamW(hInstance, pw0, hWndParent, lpDialogFunc, dwInitParam);
1804+END_ROUTINE
1805+ FreeDuplicatedString(pw0);
1806+ return r;
1807+}
1808+
1809+int mkdirM(const char * _Path)
1810+{
1811+ int r = 0;
1812+ wchar_t* pw0 = NULL;
1813+START_ROUTINE
1814+ pw0 = DuplicateMtoW(_Path, -1);
1815+ r = _wmkdir(pw0);
1816+END_ROUTINE
1817+ FreeDuplicatedString(pw0);
1818+ return r;
1819+}
1820+
1821+int _mkdirM(const char * _Path)
1822+{
1823+ int r = 0;
1824+ wchar_t* pw0 = NULL;
1825+START_ROUTINE
1826+ pw0 = DuplicateMtoW(_Path, -1);
1827+ r = _wmkdir(pw0);
1828+END_ROUTINE
1829+ FreeDuplicatedString(pw0);
1830+ return r;
1831+}
1832+
1833+int rmdirM(const char * _Path)
1834+{
1835+ int r = 0;
1836+ wchar_t* pw0 = NULL;
1837+START_ROUTINE
1838+ pw0 = DuplicateMtoW(_Path, -1);
1839+ r = _wrmdir(pw0);
1840+END_ROUTINE
1841+ FreeDuplicatedString(pw0);
1842+ return r;
1843+}
1844+
1845+int _rmdirM(const char * _Path)
1846+{
1847+ int r = 0;
1848+ wchar_t* pw0 = NULL;
1849+START_ROUTINE
1850+ pw0 = DuplicateMtoW(_Path, -1);
1851+ r = _wrmdir(pw0);
1852+END_ROUTINE
1853+ FreeDuplicatedString(pw0);
1854+ return r;
1855+}
1856+
1857+size_t _mbslenM(const unsigned char * _Str)
1858+{
1859+ size_t r = 0;
1860+ wchar_t* pw0 = NULL;
1861+START_ROUTINE
1862+ pw0 = DuplicateMtoW(_Str, -1);
1863+ r = wcslen(pw0);
1864+END_ROUTINE
1865+ FreeDuplicatedString(pw0);
1866+ return r;
1867+}
1868+
1869+unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch)
1870+{
1871+ unsigned char* r = NULL;
1872+ wchar_t* pw0 = NULL;
1873+ wchar_t* wr;
1874+START_ROUTINE
1875+ pw0 = DuplicateMtoW(_Str, -1);
1876+ // TODO: 非ASCII文字の対応
1877+ wr = wcschr(pw0, _Ch);
1878+ if(wr)
1879+ {
1880+ *wr = L'\0';
1881+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
1882+ }
1883+END_ROUTINE
1884+ FreeDuplicatedString(pw0);
1885+ return r;
1886+}
1887+
1888+unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch)
1889+{
1890+ unsigned char* r = NULL;
1891+ wchar_t* pw0 = NULL;
1892+ wchar_t* wr;
1893+START_ROUTINE
1894+ pw0 = DuplicateMtoW(_Str, -1);
1895+ // TODO: 非ASCII文字の対応
1896+ wr = wcsrchr(pw0, _Ch);
1897+ if(wr)
1898+ {
1899+ *wr = L'\0';
1900+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
1901+ }
1902+END_ROUTINE
1903+ FreeDuplicatedString(pw0);
1904+ return r;
1905+}
1906+
1907+unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr)
1908+{
1909+ unsigned char* r = NULL;
1910+ wchar_t* pw0 = NULL;
1911+ wchar_t* pw1 = NULL;
1912+ wchar_t* wr;
1913+START_ROUTINE
1914+ pw0 = DuplicateMtoW(_Str, -1);
1915+ pw1 = DuplicateMtoW(_Substr, -1);
1916+ wr = wcsstr(pw0, pw1);
1917+ if(wr)
1918+ {
1919+ *wr = L'\0';
1920+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
1921+ }
1922+END_ROUTINE
1923+ FreeDuplicatedString(pw0);
1924+ FreeDuplicatedString(pw1);
1925+ return r;
1926+}
1927+
1928+int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2)
1929+{
1930+ int r = 0;
1931+ wchar_t* pw0 = NULL;
1932+ wchar_t* pw1 = NULL;
1933+START_ROUTINE
1934+ pw0 = DuplicateMtoW(_Str1, -1);
1935+ pw1 = DuplicateMtoW(_Str2, -1);
1936+ r = wcscmp(pw0, pw1);
1937+END_ROUTINE
1938+ FreeDuplicatedString(pw0);
1939+ FreeDuplicatedString(pw1);
1940+ return r;
1941+}
1942+
1943+int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2)
1944+{
1945+ int r = 0;
1946+ wchar_t* pw0 = NULL;
1947+ wchar_t* pw1 = NULL;
1948+START_ROUTINE
1949+ pw0 = DuplicateMtoW(_Str1, -1);
1950+ pw1 = DuplicateMtoW(_Str2, -1);
1951+ r = _wcsicmp(pw0, pw1);
1952+END_ROUTINE
1953+ FreeDuplicatedString(pw0);
1954+ FreeDuplicatedString(pw1);
1955+ return r;
1956+}
1957+
1958+int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount)
1959+{
1960+ int r = 0;
1961+ wchar_t* pw0 = NULL;
1962+ wchar_t* pw1 = NULL;
1963+START_ROUTINE
1964+ pw0 = DuplicateMtoW(_Str1, -1);
1965+ pw1 = DuplicateMtoW(_Str2, -1);
1966+ r = wcsncmp(pw0, pw1, _MaxCount);
1967+END_ROUTINE
1968+ FreeDuplicatedString(pw0);
1969+ FreeDuplicatedString(pw1);
1970+ return r;
1971+}
1972+
1973+unsigned char * _mbslwrM(unsigned char * _String)
1974+{
1975+ unsigned char* r = NULL;
1976+ wchar_t* pw0 = NULL;
1977+START_ROUTINE
1978+ pw0 = DuplicateMtoW(_String, -1);
1979+ _wcslwr(pw0);
1980+ r = _String;
1981+ WtoM(_String, strlen(_String) + 1, pw0, -1);
1982+END_ROUTINE
1983+ FreeDuplicatedString(pw0);
1984+ return r;
1985+}
1986+
1987+unsigned char * _mbsuprM(unsigned char * _String)
1988+{
1989+ unsigned char* r = NULL;
1990+ wchar_t* pw0 = NULL;
1991+START_ROUTINE
1992+ pw0 = DuplicateMtoW(_String, -1);
1993+ _wcsupr(pw0);
1994+ r = _String;
1995+ WtoM(_String, strlen(_String) + 1, pw0, -1);
1996+END_ROUTINE
1997+ FreeDuplicatedString(pw0);
1998+ return r;
1999+}
2000+
2001+unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count)
2002+{
2003+ unsigned char* r = NULL;
2004+ wchar_t* pw0 = NULL;
2005+ wchar_t* wr;
2006+START_ROUTINE
2007+ pw0 = DuplicateMtoW(_Str, -1);
2008+ wr = _wcsninc(pw0, _Count);
2009+ if(wr)
2010+ {
2011+ *wr = L'\0';
2012+ r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;
2013+ }
2014+END_ROUTINE
2015+ FreeDuplicatedString(pw0);
2016+ return r;
2017+}
2018+
2019+FILE * fopenM(const char * _Filename, const char * _Mode)
2020+{
2021+ FILE* r = NULL;
2022+ wchar_t* pw0 = NULL;
2023+ wchar_t* pw1 = NULL;
2024+START_ROUTINE
2025+ pw0 = DuplicateMtoW(_Filename, -1);
2026+ pw1 = DuplicateMtoW(_Mode, -1);
2027+ r = _wfopen(pw0, pw1);
2028+END_ROUTINE
2029+ FreeDuplicatedString(pw0);
2030+ FreeDuplicatedString(pw1);
2031+ return r;
2032+}
2033+
--- a/mbswrapper.h
+++ b/mbswrapper.h
@@ -1,237 +1,237 @@
1-// mbswrapper.h
2-// Copyright (C) 2011 Suguru Kawamoto
3-// マルチバイト文字ワイド文字APIラッパー
4-
5-#ifndef __MBSWRAPPER_H__
6-#define __MBSWRAPPER_H__
7-
8-#include <stdio.h>
9-#include <windows.h>
10-#include <shlobj.h>
11-
12-#ifndef DO_NOT_REPLACE
13-
14-#undef WinMain
15-#define WinMain WinMainM
16-int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);
17-#undef LoadLibrary
18-#define LoadLibrary LoadLibraryM
19-HMODULE LoadLibraryM(LPCSTR lpLibFileName);
20-#undef CreateFile
21-#define CreateFile CreateFileM
22-HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
23-#undef MessageBox
24-#define MessageBox MessageBoxM
25-int MessageBoxM(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
26-#undef FindFirstFile
27-#define FindFirstFile FindFirstFileM
28-HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
29-#undef FindNextFile
30-#define FindNextFile FindNextFileM
31-BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
32-#undef GetLogicalDriveStrings
33-#define GetLogicalDriveStrings GetLogicalDriveStringsM
34-DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer);
35-#undef RegisterClassEx
36-#define RegisterClassEx RegisterClassExM
37-ATOM RegisterClassExM(CONST WNDCLASSEXA * v0);
38-#undef CreateWindowEx
39-#define CreateWindowEx CreateWindowExM
40-HWND CreateWindowExM(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
41-#undef GetWindowLong
42-#define GetWindowLong GetWindowLongM
43-LONG GetWindowLongM(HWND hWnd, int nIndex);
44-#undef SetWindowLong
45-#define SetWindowLong SetWindowLongM
46-LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong);
47-#undef DefWindowProc
48-#define DefWindowProc DefWindowProcM
49-LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
50-#undef CallWindowProc
51-#define CallWindowProc CallWindowProcM
52-LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
53-#undef SendMessage
54-#define SendMessage SendMessageM
55-LRESULT SendMessageM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
56-#undef DefDlgProc
57-#define DefDlgProc DefDlgProcM
58-LRESULT DefDlgProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
59-#undef SendDlgItemMessage
60-#define SendDlgItemMessage SendDlgItemMessageM
61-LRESULT SendDlgItemMessageM(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam);
62-#undef SetWindowText
63-#define SetWindowText SetWindowTextM
64-BOOL SetWindowTextM(HWND hWnd, LPCSTR lpString);
65-#undef DragQueryFile
66-#define DragQueryFile DragQueryFileM
67-UINT DragQueryFileM(HDROP hDrop, UINT iFile, LPSTR lpszFile, UINT cch);
68-#undef GetCommandLine
69-#define GetCommandLine GetCommandLineM
70-LPSTR GetCommandLineM();
71-#undef GetCurrentDirectory
72-#define GetCurrentDirectory GetCurrentDirectoryM
73-DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer);
74-#undef SetCurrentDirectory
75-#define SetCurrentDirectory SetCurrentDirectoryM
76-BOOL SetCurrentDirectoryM(LPCSTR lpPathName);
77-#undef GetTempPath
78-#define GetTempPath GetTempPathM
79-DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer);
80-#undef GetFileAttributes
81-#define GetFileAttributes GetFileAttributesM
82-DWORD GetFileAttributesM(LPCSTR lpFileName);
83-#undef GetModuleFileName
84-#define GetModuleFileName GetModuleFileNameM
85-DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize);
86-#undef RegOpenKeyEx
87-#define RegOpenKeyEx RegOpenKeyExM
88-LSTATUS RegOpenKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
89-#undef RegCreateKeyEx
90-#define RegCreateKeyEx RegCreateKeyExM
91-LSTATUS RegCreateKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);
92-#undef RegDeleteValue
93-#define RegDeleteValue RegDeleteValueM
94-LSTATUS RegDeleteValueM(HKEY hKey, LPCSTR lpValueName);
95-#undef RegQueryValueEx
96-#define RegQueryValueEx RegQueryValueExM
97-LSTATUS RegQueryValueExM(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
98-#undef RegSetValueEx
99-#define RegSetValueEx RegSetValueExM
100-LSTATUS RegSetValueExM(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData);
101-#undef TextOut
102-#define TextOut TextOutM
103-BOOL TextOutM(HDC hdc, int x, int y, LPCSTR lpString, int c);
104-#undef GetTextExtentPoint32
105-#define GetTextExtentPoint32 GetTextExtentPoint32M
106-BOOL GetTextExtentPoint32M(HDC hdc, LPCSTR lpString, int c, LPSIZE psizl);
107-#undef PropertySheet
108-#define PropertySheet PropertySheetM
109-INT_PTR PropertySheetM(LPCPROPSHEETHEADERA v0);
110-#undef GetOpenFileName
111-#define GetOpenFileName GetOpenFileNameM
112-BOOL GetOpenFileNameM(LPOPENFILENAMEA v0);
113-#undef GetSaveFileName
114-#define GetSaveFileName GetSaveFileNameM
115-BOOL GetSaveFileNameM(LPOPENFILENAMEA v0);
116-#undef HtmlHelp
117-#define HtmlHelp HtmlHelpM
118-HWND HtmlHelpM(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData);
119-#undef CreateProcess
120-#define CreateProcess CreateProcessM
121-BOOL CreateProcessM(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
122-#undef FindExecutable
123-#define FindExecutable FindExecutableM
124-HINSTANCE FindExecutableM(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
125-#undef ShellExecute
126-#define ShellExecute ShellExecuteM
127-HINSTANCE ShellExecuteM(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
128-#undef SHBrowseForFolder
129-#define SHBrowseForFolder SHBrowseForFolderM
130-PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi);
131-#undef SHGetPathFromIDList
132-#define SHGetPathFromIDList SHGetPathFromIDListM
133-BOOL SHGetPathFromIDListM(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath);
134-#undef SHFileOperation
135-#define SHFileOperation SHFileOperationM
136-int SHFileOperationM(LPSHFILEOPSTRUCTA lpFileOp);
137-#undef AppendMenu
138-#define AppendMenu AppendMenuM
139-BOOL AppendMenuM(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem);
140-#undef GetMenuItemInfo
141-#define GetMenuItemInfo GetMenuItemInfoM
142-BOOL GetMenuItemInfoM(HMENU hmenu, UINT item, BOOL fByPosition, LPMENUITEMINFOA lpmii);
143-#undef CreateFontIndirect
144-#define CreateFontIndirect CreateFontIndirectM
145-HFONT CreateFontIndirectM(CONST LOGFONTA *lplf);
146-#undef ChooseFont
147-#define ChooseFont ChooseFontM
148-BOOL ChooseFontM(LPCHOOSEFONTA v0);
149-#undef DialogBoxParam
150-#define DialogBoxParam DialogBoxParamM
151-INT_PTR DialogBoxParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
152-#undef CreateDialogParam
153-#define CreateDialogParam CreateDialogParamM
154-HWND CreateDialogParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
155-#undef mkdir
156-#define mkdir _mkdirM
157-int mkdirM(const char * _Path);
158-#undef _mkdir
159-#define _mkdir _mkdirM
160-int _mkdirM(const char * _Path);
161-#undef rmdir
162-#define rmdir rmdirM
163-int rmdirM(const char * _Path);
164-#undef _rmdir
165-#define _rmdir _rmdirM
166-int _rmdirM(const char * _Path);
167-#undef _mbslen
168-#define _mbslen _mbslenM
169-size_t _mbslenM(const unsigned char * _Str);
170-#undef _mbschr
171-#define _mbschr _mbschrM
172-unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch);
173-#undef _mbsrchr
174-#define _mbsrchr _mbsrchrM
175-unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch);
176-#undef _mbsstr
177-#define _mbsstr _mbsstrM
178-unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr);
179-#undef _mbscmp
180-#define _mbscmp _mbscmpM
181-int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2);
182-#undef _mbsicmp
183-#define _mbsicmp _mbsicmpM
184-int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2);
185-#undef _mbsncmp
186-#define _mbsncmp _mbsncmpM
187-int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount);
188-#undef _mbslwr
189-#define _mbslwr _mbslwrM
190-unsigned char * _mbslwrM(unsigned char * _String);
191-#undef _mbsupr
192-#define _mbsupr _mbsuprM
193-unsigned char * _mbsuprM(unsigned char * _String);
194-#undef _mbsninc
195-#define _mbsninc _mbsnincM
196-unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count);
197-#undef fopen
198-#define fopen fopenM
199-FILE * fopenM(const char * _Filename, const char * _Mode);
200-
201-#undef CreateWindow
202-#define CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) CreateWindowEx(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
203-#undef DialogBox
204-#define DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc) DialogBoxParam(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
205-
206-#endif
207-
208-int MtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count);
209-int WtoM(LPSTR pDst, int size, LPCWSTR pSrc, int count);
210-int AtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count);
211-int WtoA(LPSTR pDst, int size, LPCWSTR pSrc, int count);
212-int TerminateStringM(LPSTR lpString, int size);
213-int TerminateStringW(LPWSTR lpString, int size);
214-int TerminateStringA(LPSTR lpString, int size);
215-size_t GetMultiStringLengthM(LPCSTR lpString);
216-size_t GetMultiStringLengthW(LPCWSTR lpString);
217-size_t GetMultiStringLengthA(LPCSTR lpString);
218-int MtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc);
219-int WtoMMultiString(LPSTR pDst, int size, LPCWSTR pSrc);
220-int AtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc);
221-int WtoAMultiString(LPSTR pDst, int size, LPCWSTR pSrc);
222-char* AllocateStringM(int size);
223-wchar_t* AllocateStringW(int size);
224-char* AllocateStringA(int size);
225-wchar_t* DuplicateMtoW(LPCSTR lpString, int c);
226-wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size);
227-wchar_t* DuplicateMtoWMultiString(LPCSTR lpString);
228-wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size);
229-char* DuplicateWtoM(LPCWSTR lpString, int c);
230-wchar_t* DuplicateAtoW(LPCSTR lpString, int c);
231-char* DuplicateWtoA(LPCWSTR lpString, int c);
232-void FreeDuplicatedString(void* p);
233-
234-int WINAPI WinMainM(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
235-
236-#endif
237-
1+// mbswrapper.h
2+// Copyright (C) 2011 Suguru Kawamoto
3+// マルチバイト文字ワイド文字APIラッパー
4+
5+#ifndef __MBSWRAPPER_H__
6+#define __MBSWRAPPER_H__
7+
8+#include <stdio.h>
9+#include <windows.h>
10+#include <shlobj.h>
11+
12+#ifndef DO_NOT_REPLACE
13+
14+#undef WinMain
15+#define WinMain WinMainM
16+int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);
17+#undef LoadLibrary
18+#define LoadLibrary LoadLibraryM
19+HMODULE LoadLibraryM(LPCSTR lpLibFileName);
20+#undef CreateFile
21+#define CreateFile CreateFileM
22+HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
23+#undef MessageBox
24+#define MessageBox MessageBoxM
25+int MessageBoxM(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
26+#undef FindFirstFile
27+#define FindFirstFile FindFirstFileM
28+HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData);
29+#undef FindNextFile
30+#define FindNextFile FindNextFileM
31+BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData);
32+#undef GetLogicalDriveStrings
33+#define GetLogicalDriveStrings GetLogicalDriveStringsM
34+DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer);
35+#undef RegisterClassEx
36+#define RegisterClassEx RegisterClassExM
37+ATOM RegisterClassExM(CONST WNDCLASSEXA * v0);
38+#undef CreateWindowEx
39+#define CreateWindowEx CreateWindowExM
40+HWND CreateWindowExM(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
41+#undef GetWindowLong
42+#define GetWindowLong GetWindowLongM
43+LONG GetWindowLongM(HWND hWnd, int nIndex);
44+#undef SetWindowLong
45+#define SetWindowLong SetWindowLongM
46+LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong);
47+#undef DefWindowProc
48+#define DefWindowProc DefWindowProcM
49+LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
50+#undef CallWindowProc
51+#define CallWindowProc CallWindowProcM
52+LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
53+#undef SendMessage
54+#define SendMessage SendMessageM
55+LRESULT SendMessageM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
56+#undef DefDlgProc
57+#define DefDlgProc DefDlgProcM
58+LRESULT DefDlgProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
59+#undef SendDlgItemMessage
60+#define SendDlgItemMessage SendDlgItemMessageM
61+LRESULT SendDlgItemMessageM(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam);
62+#undef SetWindowText
63+#define SetWindowText SetWindowTextM
64+BOOL SetWindowTextM(HWND hWnd, LPCSTR lpString);
65+#undef DragQueryFile
66+#define DragQueryFile DragQueryFileM
67+UINT DragQueryFileM(HDROP hDrop, UINT iFile, LPSTR lpszFile, UINT cch);
68+#undef GetCommandLine
69+#define GetCommandLine GetCommandLineM
70+LPSTR GetCommandLineM();
71+#undef GetCurrentDirectory
72+#define GetCurrentDirectory GetCurrentDirectoryM
73+DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer);
74+#undef SetCurrentDirectory
75+#define SetCurrentDirectory SetCurrentDirectoryM
76+BOOL SetCurrentDirectoryM(LPCSTR lpPathName);
77+#undef GetTempPath
78+#define GetTempPath GetTempPathM
79+DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer);
80+#undef GetFileAttributes
81+#define GetFileAttributes GetFileAttributesM
82+DWORD GetFileAttributesM(LPCSTR lpFileName);
83+#undef GetModuleFileName
84+#define GetModuleFileName GetModuleFileNameM
85+DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize);
86+#undef RegOpenKeyEx
87+#define RegOpenKeyEx RegOpenKeyExM
88+LSTATUS RegOpenKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
89+#undef RegCreateKeyEx
90+#define RegCreateKeyEx RegCreateKeyExM
91+LSTATUS RegCreateKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);
92+#undef RegDeleteValue
93+#define RegDeleteValue RegDeleteValueM
94+LSTATUS RegDeleteValueM(HKEY hKey, LPCSTR lpValueName);
95+#undef RegQueryValueEx
96+#define RegQueryValueEx RegQueryValueExM
97+LSTATUS RegQueryValueExM(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
98+#undef RegSetValueEx
99+#define RegSetValueEx RegSetValueExM
100+LSTATUS RegSetValueExM(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData);
101+#undef TextOut
102+#define TextOut TextOutM
103+BOOL TextOutM(HDC hdc, int x, int y, LPCSTR lpString, int c);
104+#undef GetTextExtentPoint32
105+#define GetTextExtentPoint32 GetTextExtentPoint32M
106+BOOL GetTextExtentPoint32M(HDC hdc, LPCSTR lpString, int c, LPSIZE psizl);
107+#undef PropertySheet
108+#define PropertySheet PropertySheetM
109+INT_PTR PropertySheetM(LPCPROPSHEETHEADERA v0);
110+#undef GetOpenFileName
111+#define GetOpenFileName GetOpenFileNameM
112+BOOL GetOpenFileNameM(LPOPENFILENAMEA v0);
113+#undef GetSaveFileName
114+#define GetSaveFileName GetSaveFileNameM
115+BOOL GetSaveFileNameM(LPOPENFILENAMEA v0);
116+#undef HtmlHelp
117+#define HtmlHelp HtmlHelpM
118+HWND HtmlHelpM(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData);
119+#undef CreateProcess
120+#define CreateProcess CreateProcessM
121+BOOL CreateProcessM(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
122+#undef FindExecutable
123+#define FindExecutable FindExecutableM
124+HINSTANCE FindExecutableM(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
125+#undef ShellExecute
126+#define ShellExecute ShellExecuteM
127+HINSTANCE ShellExecuteM(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
128+#undef SHBrowseForFolder
129+#define SHBrowseForFolder SHBrowseForFolderM
130+PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi);
131+#undef SHGetPathFromIDList
132+#define SHGetPathFromIDList SHGetPathFromIDListM
133+BOOL SHGetPathFromIDListM(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath);
134+#undef SHFileOperation
135+#define SHFileOperation SHFileOperationM
136+int SHFileOperationM(LPSHFILEOPSTRUCTA lpFileOp);
137+#undef AppendMenu
138+#define AppendMenu AppendMenuM
139+BOOL AppendMenuM(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem);
140+#undef GetMenuItemInfo
141+#define GetMenuItemInfo GetMenuItemInfoM
142+BOOL GetMenuItemInfoM(HMENU hmenu, UINT item, BOOL fByPosition, LPMENUITEMINFOA lpmii);
143+#undef CreateFontIndirect
144+#define CreateFontIndirect CreateFontIndirectM
145+HFONT CreateFontIndirectM(CONST LOGFONTA *lplf);
146+#undef ChooseFont
147+#define ChooseFont ChooseFontM
148+BOOL ChooseFontM(LPCHOOSEFONTA v0);
149+#undef DialogBoxParam
150+#define DialogBoxParam DialogBoxParamM
151+INT_PTR DialogBoxParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
152+#undef CreateDialogParam
153+#define CreateDialogParam CreateDialogParamM
154+HWND CreateDialogParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
155+#undef mkdir
156+#define mkdir _mkdirM
157+int mkdirM(const char * _Path);
158+#undef _mkdir
159+#define _mkdir _mkdirM
160+int _mkdirM(const char * _Path);
161+#undef rmdir
162+#define rmdir rmdirM
163+int rmdirM(const char * _Path);
164+#undef _rmdir
165+#define _rmdir _rmdirM
166+int _rmdirM(const char * _Path);
167+#undef _mbslen
168+#define _mbslen _mbslenM
169+size_t _mbslenM(const unsigned char * _Str);
170+#undef _mbschr
171+#define _mbschr _mbschrM
172+unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch);
173+#undef _mbsrchr
174+#define _mbsrchr _mbsrchrM
175+unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch);
176+#undef _mbsstr
177+#define _mbsstr _mbsstrM
178+unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr);
179+#undef _mbscmp
180+#define _mbscmp _mbscmpM
181+int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2);
182+#undef _mbsicmp
183+#define _mbsicmp _mbsicmpM
184+int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2);
185+#undef _mbsncmp
186+#define _mbsncmp _mbsncmpM
187+int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount);
188+#undef _mbslwr
189+#define _mbslwr _mbslwrM
190+unsigned char * _mbslwrM(unsigned char * _String);
191+#undef _mbsupr
192+#define _mbsupr _mbsuprM
193+unsigned char * _mbsuprM(unsigned char * _String);
194+#undef _mbsninc
195+#define _mbsninc _mbsnincM
196+unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count);
197+#undef fopen
198+#define fopen fopenM
199+FILE * fopenM(const char * _Filename, const char * _Mode);
200+
201+#undef CreateWindow
202+#define CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) CreateWindowEx(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam)
203+#undef DialogBox
204+#define DialogBox(hInstance, lpTemplate, hWndParent, lpDialogFunc) DialogBoxParam(hInstance, lpTemplate, hWndParent, lpDialogFunc, 0L)
205+
206+#endif
207+
208+int MtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count);
209+int WtoM(LPSTR pDst, int size, LPCWSTR pSrc, int count);
210+int AtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count);
211+int WtoA(LPSTR pDst, int size, LPCWSTR pSrc, int count);
212+int TerminateStringM(LPSTR lpString, int size);
213+int TerminateStringW(LPWSTR lpString, int size);
214+int TerminateStringA(LPSTR lpString, int size);
215+size_t GetMultiStringLengthM(LPCSTR lpString);
216+size_t GetMultiStringLengthW(LPCWSTR lpString);
217+size_t GetMultiStringLengthA(LPCSTR lpString);
218+int MtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc);
219+int WtoMMultiString(LPSTR pDst, int size, LPCWSTR pSrc);
220+int AtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc);
221+int WtoAMultiString(LPSTR pDst, int size, LPCWSTR pSrc);
222+char* AllocateStringM(int size);
223+wchar_t* AllocateStringW(int size);
224+char* AllocateStringA(int size);
225+wchar_t* DuplicateMtoW(LPCSTR lpString, int c);
226+wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size);
227+wchar_t* DuplicateMtoWMultiString(LPCSTR lpString);
228+wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size);
229+char* DuplicateWtoM(LPCWSTR lpString, int c);
230+wchar_t* DuplicateAtoW(LPCSTR lpString, int c);
231+char* DuplicateWtoA(LPCWSTR lpString, int c);
232+void FreeDuplicatedString(void* p);
233+
234+int WINAPI WinMainM(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
235+
236+#endif
237+
--- a/mbtoutf8.bat
+++ b/mbtoutf8.bat
@@ -1,4 +1,4 @@
1-mbtoutf8 mesg-jpn.old.h mesg-jpn.h
2-mbtoutf8 mesg-eng.old.h mesg-eng.h
3-encutf8 mesg-jpn.h mesg-jpn.h
4-encutf8 mesg-eng.h mesg-eng.h
1+mbtoutf8 mesg-jpn.old.h mesg-jpn.h
2+mbtoutf8 mesg-eng.old.h mesg-eng.h
3+encutf8 mesg-jpn.h mesg-jpn.h
4+encutf8 mesg-eng.h mesg-eng.h
--- a/mbtoutf8/ReadMe.txt
+++ b/mbtoutf8/ReadMe.txt
@@ -1,29 +1,29 @@
1-========================================================================
2- コンソール アプリケーション : mbtoutf8 プロジェクトの概要
3-========================================================================
4-
5-この mbtoutf8 アプリケーションは、AppWizard によって作成されました。
6-
7-このファイルには、mbtoutf8 アプリケーションを構成する各ファイル
8-の内容の概略が記述されています。
9-
10-
11-mbtoutf8.vcproj
12- これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。
13- ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。
14-
15-mbtoutf8.cpp
16- これは、メインのアプリケーション ソース ファイルです。
17-
18-/////////////////////////////////////////////////////////////////////////////
19-その他の標準ファイル :
20-
21-StdAfx.h, StdAfx.cpp
22- これらのファイルは、プリコンパイル済みヘッダー (PCH) ファイル mbtoutf8.pch とプリコンパイル済み型ファイル StdAfx.obj をビルドするために使用されます。
23-
24-/////////////////////////////////////////////////////////////////////////////
25-その他のメモ :
26-
27-AppWizard では、ユーザーが追加またはカスタマイズする必要のあるソース コードの部分を示すために、"TODO:" コメントを使用します。
28-
29-/////////////////////////////////////////////////////////////////////////////
1+========================================================================
2+ コンソール アプリケーション : mbtoutf8 プロジェクトの概要
3+========================================================================
4+
5+この mbtoutf8 アプリケーションは、AppWizard によって作成されました。
6+
7+このファイルには、mbtoutf8 アプリケーションを構成する各ファイル
8+の内容の概略が記述されています。
9+
10+
11+mbtoutf8.vcproj
12+ これは、アプリケーション ウィザードを使用して生成された VC++ プロジェクトのメイン プロジェクト ファイルです。
13+ ファイルを生成した Visual C++ のバージョンに関する情報と、アプリケーション ウィザードで選択されたプラットフォーム、構成、およびプロジェクト機能に関する情報が含まれています。
14+
15+mbtoutf8.cpp
16+ これは、メインのアプリケーション ソース ファイルです。
17+
18+/////////////////////////////////////////////////////////////////////////////
19+その他の標準ファイル :
20+
21+StdAfx.h, StdAfx.cpp
22+ これらのファイルは、プリコンパイル済みヘッダー (PCH) ファイル mbtoutf8.pch とプリコンパイル済み型ファイル StdAfx.obj をビルドするために使用されます。
23+
24+/////////////////////////////////////////////////////////////////////////////
25+その他のメモ :
26+
27+AppWizard では、ユーザーが追加またはカスタマイズする必要のあるソース コードの部分を示すために、"TODO:" コメントを使用します。
28+
29+/////////////////////////////////////////////////////////////////////////////
--- a/mbtoutf8/mbtoutf8.cpp
+++ b/mbtoutf8/mbtoutf8.cpp
@@ -1,155 +1,155 @@
1-// mbtoutf8.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
2-//
3-
4-#include "stdafx.h"
5-
6-
7-int _tmain(int argc, _TCHAR* argv[])
8-{
9- FILE* fpIn;
10- FILE* fpOut;
11- char InBuffer[16384];
12- char OutBuffer[65536];
13- int InPosition;
14- int OutPosition;
15- bool bEscape;
16- bool bString;
17- bool bEncoded;
18- int Count;
19- int UTF8Count;
20- wchar_t UTF16Buffer[4];
21- char UTF8Buffer[8];
22- int i;
23- _tsetlocale(LC_ALL, _T(""));
24- if(argc != 3)
25- {
26- _tprintf(_T("マルチバイト文字(コードページ932またはShift JIS)で書かれたC言語ソースファイル内の文字列リテラルをUTF-8にエンコードします。\n"));
27- _tprintf(_T("コマンドライン\n"));
28- _tprintf(_T("mbtoutf8 [in] [out]\n"));
29- _tprintf(_T("[in] 元のソースファイルのファイル名\n"));
30- _tprintf(_T("[out] 保存先のファイル名\n"));
31- return 0;
32- }
33- fpIn = _tfopen(argv[1], _T("rt"));
34- if(!fpIn)
35- {
36- _tprintf(_T("ファイル\"%s\"が開けません。\n"), argv[1]);
37- return 0;
38- }
39- fpOut = _tfopen(argv[2], _T("wt"));
40- if(!fpIn)
41- {
42- _tprintf(_T("ファイル\"%s\"が作成できません。\n"), argv[2]);
43- return 0;
44- }
45- while(fgets(InBuffer, sizeof(InBuffer) / sizeof(char), fpIn))
46- {
47- InPosition = 0;
48- OutPosition = 0;
49- bEscape = false;
50- bString = false;
51- bEncoded = false;
52- while(InBuffer[InPosition])
53- {
54- Count = max(mblen(&InBuffer[InPosition], 4), 1);
55- if(Count == 1)
56- {
57- switch(InBuffer[InPosition])
58- {
59- case '\\':
60- bEscape = !bEscape;
61- bEncoded = false;
62- strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
63- InPosition += Count;
64- OutPosition += Count;
65- break;
66- case '\"':
67- bEscape = false;
68- bString = !bString;
69- bEncoded = false;
70- strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
71- InPosition += Count;
72- OutPosition += Count;
73- break;
74- case '0':
75- case '1':
76- case '2':
77- case '3':
78- case '4':
79- case '5':
80- case '6':
81- case '7':
82- case '8':
83- case '9':
84- case 'A':
85- case 'B':
86- case 'C':
87- case 'D':
88- case 'E':
89- case 'F':
90- case 'a':
91- case 'b':
92- case 'c':
93- case 'd':
94- case 'e':
95- case 'f':
96- bEscape = false;
97- if(bEncoded)
98- {
99- for(i = 0; i < Count; i++)
100- {
101- sprintf(&OutBuffer[OutPosition], "\\x%02X", (unsigned char)InBuffer[InPosition]);
102- InPosition++;
103- OutPosition += 4;
104- }
105- }
106- else
107- {
108- strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
109- InPosition += Count;
110- OutPosition += Count;
111- break;
112- }
113- break;
114- default:
115- bEscape = false;
116- bEncoded = false;
117- strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
118- InPosition += Count;
119- OutPosition += Count;
120- break;
121- }
122- }
123- else
124- {
125- if(bString)
126- {
127- bEscape = false;
128- bEncoded = true;
129- UTF8Count = MultiByteToWideChar(CP_ACP, 0, &InBuffer[InPosition], Count, UTF16Buffer, sizeof(UTF16Buffer) / sizeof(wchar_t));
130- UTF8Count = WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer, UTF8Count, UTF8Buffer, sizeof(UTF8Buffer) / sizeof(char), NULL, NULL);
131- InPosition += Count;
132- for(i = 0; i < UTF8Count; i++)
133- {
134- sprintf(&OutBuffer[OutPosition], "\\x%02X", (unsigned char)UTF8Buffer[i]);
135- OutPosition += 4;
136- }
137- }
138- else
139- {
140- bEscape = false;
141- bEncoded = false;
142- strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
143- InPosition += Count;
144- OutPosition += Count;
145- }
146- }
147- }
148- OutBuffer[OutPosition] = '\0';
149- fputs(OutBuffer, fpOut);
150- }
151- fclose(fpIn);
152- fclose(fpOut);
153- return 0;
154-}
155-
1+// mbtoutf8.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
2+//
3+
4+#include "stdafx.h"
5+
6+
7+int _tmain(int argc, _TCHAR* argv[])
8+{
9+ FILE* fpIn;
10+ FILE* fpOut;
11+ char InBuffer[16384];
12+ char OutBuffer[65536];
13+ int InPosition;
14+ int OutPosition;
15+ bool bEscape;
16+ bool bString;
17+ bool bEncoded;
18+ int Count;
19+ int UTF8Count;
20+ wchar_t UTF16Buffer[4];
21+ char UTF8Buffer[8];
22+ int i;
23+ _tsetlocale(LC_ALL, _T(""));
24+ if(argc != 3)
25+ {
26+ _tprintf(_T("マルチバイト文字(コードページ932またはShift JIS)で書かれたC言語ソースファイル内の文字列リテラルをUTF-8にエンコードします。\n"));
27+ _tprintf(_T("コマンドライン\n"));
28+ _tprintf(_T("mbtoutf8 [in] [out]\n"));
29+ _tprintf(_T("[in] 元のソースファイルのファイル名\n"));
30+ _tprintf(_T("[out] 保存先のファイル名\n"));
31+ return 0;
32+ }
33+ fpIn = _tfopen(argv[1], _T("rt"));
34+ if(!fpIn)
35+ {
36+ _tprintf(_T("ファイル\"%s\"が開けません。\n"), argv[1]);
37+ return 0;
38+ }
39+ fpOut = _tfopen(argv[2], _T("wt"));
40+ if(!fpIn)
41+ {
42+ _tprintf(_T("ファイル\"%s\"が作成できません。\n"), argv[2]);
43+ return 0;
44+ }
45+ while(fgets(InBuffer, sizeof(InBuffer) / sizeof(char), fpIn))
46+ {
47+ InPosition = 0;
48+ OutPosition = 0;
49+ bEscape = false;
50+ bString = false;
51+ bEncoded = false;
52+ while(InBuffer[InPosition])
53+ {
54+ Count = max(mblen(&InBuffer[InPosition], 4), 1);
55+ if(Count == 1)
56+ {
57+ switch(InBuffer[InPosition])
58+ {
59+ case '\\':
60+ bEscape = !bEscape;
61+ bEncoded = false;
62+ strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
63+ InPosition += Count;
64+ OutPosition += Count;
65+ break;
66+ case '\"':
67+ bEscape = false;
68+ bString = !bString;
69+ bEncoded = false;
70+ strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
71+ InPosition += Count;
72+ OutPosition += Count;
73+ break;
74+ case '0':
75+ case '1':
76+ case '2':
77+ case '3':
78+ case '4':
79+ case '5':
80+ case '6':
81+ case '7':
82+ case '8':
83+ case '9':
84+ case 'A':
85+ case 'B':
86+ case 'C':
87+ case 'D':
88+ case 'E':
89+ case 'F':
90+ case 'a':
91+ case 'b':
92+ case 'c':
93+ case 'd':
94+ case 'e':
95+ case 'f':
96+ bEscape = false;
97+ if(bEncoded)
98+ {
99+ for(i = 0; i < Count; i++)
100+ {
101+ sprintf(&OutBuffer[OutPosition], "\\x%02X", (unsigned char)InBuffer[InPosition]);
102+ InPosition++;
103+ OutPosition += 4;
104+ }
105+ }
106+ else
107+ {
108+ strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
109+ InPosition += Count;
110+ OutPosition += Count;
111+ break;
112+ }
113+ break;
114+ default:
115+ bEscape = false;
116+ bEncoded = false;
117+ strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
118+ InPosition += Count;
119+ OutPosition += Count;
120+ break;
121+ }
122+ }
123+ else
124+ {
125+ if(bString)
126+ {
127+ bEscape = false;
128+ bEncoded = true;
129+ UTF8Count = MultiByteToWideChar(CP_ACP, 0, &InBuffer[InPosition], Count, UTF16Buffer, sizeof(UTF16Buffer) / sizeof(wchar_t));
130+ UTF8Count = WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer, UTF8Count, UTF8Buffer, sizeof(UTF8Buffer) / sizeof(char), NULL, NULL);
131+ InPosition += Count;
132+ for(i = 0; i < UTF8Count; i++)
133+ {
134+ sprintf(&OutBuffer[OutPosition], "\\x%02X", (unsigned char)UTF8Buffer[i]);
135+ OutPosition += 4;
136+ }
137+ }
138+ else
139+ {
140+ bEscape = false;
141+ bEncoded = false;
142+ strncpy(&OutBuffer[OutPosition], &InBuffer[InPosition], Count);
143+ InPosition += Count;
144+ OutPosition += Count;
145+ }
146+ }
147+ }
148+ OutBuffer[OutPosition] = '\0';
149+ fputs(OutBuffer, fpOut);
150+ }
151+ fclose(fpIn);
152+ fclose(fpOut);
153+ return 0;
154+}
155+
--- a/mbtoutf8/mbtoutf8.sln
+++ b/mbtoutf8/mbtoutf8.sln
@@ -1,20 +1,20 @@
1-
2-Microsoft Visual Studio Solution File, Format Version 10.00
3-# Visual Studio 2008
4-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mbtoutf8", "mbtoutf8.vcproj", "{655A8FD3-5998-472F-8906-F0A028B70C4F}"
5-EndProject
6-Global
7- GlobalSection(SolutionConfigurationPlatforms) = preSolution
8- Debug|Win32 = Debug|Win32
9- Release|Win32 = Release|Win32
10- EndGlobalSection
11- GlobalSection(ProjectConfigurationPlatforms) = postSolution
12- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.ActiveCfg = Debug|Win32
13- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.Build.0 = Debug|Win32
14- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.ActiveCfg = Release|Win32
15- {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.Build.0 = Release|Win32
16- EndGlobalSection
17- GlobalSection(SolutionProperties) = preSolution
18- HideSolutionNode = FALSE
19- EndGlobalSection
20-EndGlobal
1+
2+Microsoft Visual Studio Solution File, Format Version 10.00
3+# Visual Studio 2008
4+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mbtoutf8", "mbtoutf8.vcproj", "{655A8FD3-5998-472F-8906-F0A028B70C4F}"
5+EndProject
6+Global
7+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
8+ Debug|Win32 = Debug|Win32
9+ Release|Win32 = Release|Win32
10+ EndGlobalSection
11+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
12+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.ActiveCfg = Debug|Win32
13+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Debug|Win32.Build.0 = Debug|Win32
14+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.ActiveCfg = Release|Win32
15+ {655A8FD3-5998-472F-8906-F0A028B70C4F}.Release|Win32.Build.0 = Release|Win32
16+ EndGlobalSection
17+ GlobalSection(SolutionProperties) = preSolution
18+ HideSolutionNode = FALSE
19+ EndGlobalSection
20+EndGlobal
--- a/mbtoutf8/mbtoutf8.vcproj
+++ b/mbtoutf8/mbtoutf8.vcproj
@@ -1,225 +1,225 @@
1-<?xml version="1.0" encoding="shift_jis"?>
2-<VisualStudioProject
3- ProjectType="Visual C++"
4- Version="9.00"
5- Name="mbtoutf8"
6- ProjectGUID="{655A8FD3-5998-472F-8906-F0A028B70C4F}"
7- RootNamespace="mbtoutf8"
8- Keyword="Win32Proj"
9- TargetFrameworkVersion="196613"
10- >
11- <Platforms>
12- <Platform
13- Name="Win32"
14- />
15- </Platforms>
16- <ToolFiles>
17- </ToolFiles>
18- <Configurations>
19- <Configuration
20- Name="Debug|Win32"
21- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
22- IntermediateDirectory="$(ConfigurationName)"
23- ConfigurationType="1"
24- CharacterSet="1"
25- >
26- <Tool
27- Name="VCPreBuildEventTool"
28- />
29- <Tool
30- Name="VCCustomBuildTool"
31- />
32- <Tool
33- Name="VCXMLDataGeneratorTool"
34- />
35- <Tool
36- Name="VCWebServiceProxyGeneratorTool"
37- />
38- <Tool
39- Name="VCMIDLTool"
40- />
41- <Tool
42- Name="VCCLCompilerTool"
43- Optimization="0"
44- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
45- MinimalRebuild="true"
46- BasicRuntimeChecks="3"
47- RuntimeLibrary="3"
48- UsePrecompiledHeader="2"
49- WarningLevel="3"
50- DebugInformationFormat="4"
51- />
52- <Tool
53- Name="VCManagedResourceCompilerTool"
54- />
55- <Tool
56- Name="VCResourceCompilerTool"
57- />
58- <Tool
59- Name="VCPreLinkEventTool"
60- />
61- <Tool
62- Name="VCLinkerTool"
63- LinkIncremental="2"
64- GenerateDebugInformation="true"
65- SubSystem="1"
66- TargetMachine="1"
67- />
68- <Tool
69- Name="VCALinkTool"
70- />
71- <Tool
72- Name="VCManifestTool"
73- />
74- <Tool
75- Name="VCXDCMakeTool"
76- />
77- <Tool
78- Name="VCBscMakeTool"
79- />
80- <Tool
81- Name="VCFxCopTool"
82- />
83- <Tool
84- Name="VCAppVerifierTool"
85- />
86- <Tool
87- Name="VCPostBuildEventTool"
88- />
89- </Configuration>
90- <Configuration
91- Name="Release|Win32"
92- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
93- IntermediateDirectory="$(ConfigurationName)"
94- ConfigurationType="1"
95- CharacterSet="1"
96- WholeProgramOptimization="1"
97- >
98- <Tool
99- Name="VCPreBuildEventTool"
100- />
101- <Tool
102- Name="VCCustomBuildTool"
103- />
104- <Tool
105- Name="VCXMLDataGeneratorTool"
106- />
107- <Tool
108- Name="VCWebServiceProxyGeneratorTool"
109- />
110- <Tool
111- Name="VCMIDLTool"
112- />
113- <Tool
114- Name="VCCLCompilerTool"
115- Optimization="2"
116- EnableIntrinsicFunctions="true"
117- PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
118- RuntimeLibrary="2"
119- EnableFunctionLevelLinking="true"
120- UsePrecompiledHeader="2"
121- WarningLevel="3"
122- DebugInformationFormat="3"
123- />
124- <Tool
125- Name="VCManagedResourceCompilerTool"
126- />
127- <Tool
128- Name="VCResourceCompilerTool"
129- />
130- <Tool
131- Name="VCPreLinkEventTool"
132- />
133- <Tool
134- Name="VCLinkerTool"
135- LinkIncremental="1"
136- GenerateDebugInformation="true"
137- SubSystem="1"
138- OptimizeReferences="2"
139- EnableCOMDATFolding="2"
140- TargetMachine="1"
141- />
142- <Tool
143- Name="VCALinkTool"
144- />
145- <Tool
146- Name="VCManifestTool"
147- />
148- <Tool
149- Name="VCXDCMakeTool"
150- />
151- <Tool
152- Name="VCBscMakeTool"
153- />
154- <Tool
155- Name="VCFxCopTool"
156- />
157- <Tool
158- Name="VCAppVerifierTool"
159- />
160- <Tool
161- Name="VCPostBuildEventTool"
162- />
163- </Configuration>
164- </Configurations>
165- <References>
166- </References>
167- <Files>
168- <Filter
169- Name="ソース ファイル"
170- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
171- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
172- >
173- <File
174- RelativePath=".\mbtoutf8.cpp"
175- >
176- </File>
177- <File
178- RelativePath=".\stdafx.cpp"
179- >
180- <FileConfiguration
181- Name="Debug|Win32"
182- >
183- <Tool
184- Name="VCCLCompilerTool"
185- UsePrecompiledHeader="1"
186- />
187- </FileConfiguration>
188- <FileConfiguration
189- Name="Release|Win32"
190- >
191- <Tool
192- Name="VCCLCompilerTool"
193- UsePrecompiledHeader="1"
194- />
195- </FileConfiguration>
196- </File>
197- </Filter>
198- <Filter
199- Name="ヘッダー ファイル"
200- Filter="h;hpp;hxx;hm;inl;inc;xsd"
201- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
202- >
203- <File
204- RelativePath=".\stdafx.h"
205- >
206- </File>
207- <File
208- RelativePath=".\targetver.h"
209- >
210- </File>
211- </Filter>
212- <Filter
213- Name="リソース ファイル"
214- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
215- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
216- >
217- </Filter>
218- <File
219- RelativePath=".\ReadMe.txt"
220- >
221- </File>
222- </Files>
223- <Globals>
224- </Globals>
225-</VisualStudioProject>
1+<?xml version="1.0" encoding="shift_jis"?>
2+<VisualStudioProject
3+ ProjectType="Visual C++"
4+ Version="9.00"
5+ Name="mbtoutf8"
6+ ProjectGUID="{655A8FD3-5998-472F-8906-F0A028B70C4F}"
7+ RootNamespace="mbtoutf8"
8+ Keyword="Win32Proj"
9+ TargetFrameworkVersion="196613"
10+ >
11+ <Platforms>
12+ <Platform
13+ Name="Win32"
14+ />
15+ </Platforms>
16+ <ToolFiles>
17+ </ToolFiles>
18+ <Configurations>
19+ <Configuration
20+ Name="Debug|Win32"
21+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
22+ IntermediateDirectory="$(ConfigurationName)"
23+ ConfigurationType="1"
24+ CharacterSet="1"
25+ >
26+ <Tool
27+ Name="VCPreBuildEventTool"
28+ />
29+ <Tool
30+ Name="VCCustomBuildTool"
31+ />
32+ <Tool
33+ Name="VCXMLDataGeneratorTool"
34+ />
35+ <Tool
36+ Name="VCWebServiceProxyGeneratorTool"
37+ />
38+ <Tool
39+ Name="VCMIDLTool"
40+ />
41+ <Tool
42+ Name="VCCLCompilerTool"
43+ Optimization="0"
44+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
45+ MinimalRebuild="true"
46+ BasicRuntimeChecks="3"
47+ RuntimeLibrary="3"
48+ UsePrecompiledHeader="2"
49+ WarningLevel="3"
50+ DebugInformationFormat="4"
51+ />
52+ <Tool
53+ Name="VCManagedResourceCompilerTool"
54+ />
55+ <Tool
56+ Name="VCResourceCompilerTool"
57+ />
58+ <Tool
59+ Name="VCPreLinkEventTool"
60+ />
61+ <Tool
62+ Name="VCLinkerTool"
63+ LinkIncremental="2"
64+ GenerateDebugInformation="true"
65+ SubSystem="1"
66+ TargetMachine="1"
67+ />
68+ <Tool
69+ Name="VCALinkTool"
70+ />
71+ <Tool
72+ Name="VCManifestTool"
73+ />
74+ <Tool
75+ Name="VCXDCMakeTool"
76+ />
77+ <Tool
78+ Name="VCBscMakeTool"
79+ />
80+ <Tool
81+ Name="VCFxCopTool"
82+ />
83+ <Tool
84+ Name="VCAppVerifierTool"
85+ />
86+ <Tool
87+ Name="VCPostBuildEventTool"
88+ />
89+ </Configuration>
90+ <Configuration
91+ Name="Release|Win32"
92+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
93+ IntermediateDirectory="$(ConfigurationName)"
94+ ConfigurationType="1"
95+ CharacterSet="1"
96+ WholeProgramOptimization="1"
97+ >
98+ <Tool
99+ Name="VCPreBuildEventTool"
100+ />
101+ <Tool
102+ Name="VCCustomBuildTool"
103+ />
104+ <Tool
105+ Name="VCXMLDataGeneratorTool"
106+ />
107+ <Tool
108+ Name="VCWebServiceProxyGeneratorTool"
109+ />
110+ <Tool
111+ Name="VCMIDLTool"
112+ />
113+ <Tool
114+ Name="VCCLCompilerTool"
115+ Optimization="2"
116+ EnableIntrinsicFunctions="true"
117+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
118+ RuntimeLibrary="2"
119+ EnableFunctionLevelLinking="true"
120+ UsePrecompiledHeader="2"
121+ WarningLevel="3"
122+ DebugInformationFormat="3"
123+ />
124+ <Tool
125+ Name="VCManagedResourceCompilerTool"
126+ />
127+ <Tool
128+ Name="VCResourceCompilerTool"
129+ />
130+ <Tool
131+ Name="VCPreLinkEventTool"
132+ />
133+ <Tool
134+ Name="VCLinkerTool"
135+ LinkIncremental="1"
136+ GenerateDebugInformation="true"
137+ SubSystem="1"
138+ OptimizeReferences="2"
139+ EnableCOMDATFolding="2"
140+ TargetMachine="1"
141+ />
142+ <Tool
143+ Name="VCALinkTool"
144+ />
145+ <Tool
146+ Name="VCManifestTool"
147+ />
148+ <Tool
149+ Name="VCXDCMakeTool"
150+ />
151+ <Tool
152+ Name="VCBscMakeTool"
153+ />
154+ <Tool
155+ Name="VCFxCopTool"
156+ />
157+ <Tool
158+ Name="VCAppVerifierTool"
159+ />
160+ <Tool
161+ Name="VCPostBuildEventTool"
162+ />
163+ </Configuration>
164+ </Configurations>
165+ <References>
166+ </References>
167+ <Files>
168+ <Filter
169+ Name="ソース ファイル"
170+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
171+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
172+ >
173+ <File
174+ RelativePath=".\mbtoutf8.cpp"
175+ >
176+ </File>
177+ <File
178+ RelativePath=".\stdafx.cpp"
179+ >
180+ <FileConfiguration
181+ Name="Debug|Win32"
182+ >
183+ <Tool
184+ Name="VCCLCompilerTool"
185+ UsePrecompiledHeader="1"
186+ />
187+ </FileConfiguration>
188+ <FileConfiguration
189+ Name="Release|Win32"
190+ >
191+ <Tool
192+ Name="VCCLCompilerTool"
193+ UsePrecompiledHeader="1"
194+ />
195+ </FileConfiguration>
196+ </File>
197+ </Filter>
198+ <Filter
199+ Name="ヘッダー ファイル"
200+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
201+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
202+ >
203+ <File
204+ RelativePath=".\stdafx.h"
205+ >
206+ </File>
207+ <File
208+ RelativePath=".\targetver.h"
209+ >
210+ </File>
211+ </Filter>
212+ <Filter
213+ Name="リソース ファイル"
214+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
215+ UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
216+ >
217+ </Filter>
218+ <File
219+ RelativePath=".\ReadMe.txt"
220+ >
221+ </File>
222+ </Files>
223+ <Globals>
224+ </Globals>
225+</VisualStudioProject>
--- a/mbtoutf8/stdafx.cpp
+++ b/mbtoutf8/stdafx.cpp
@@ -1,8 +1,8 @@
1-// stdafx.cpp : 標準インクルード mbtoutf8.pch のみを
2-// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
3-// stdafx.obj にはプリコンパイル済み型情報が含まれます。
4-
5-#include "stdafx.h"
6-
7-// TODO: このファイルではなく、STDAFX.H で必要な
8-// 追加ヘッダーを参照してください。
1+// stdafx.cpp : 標準インクルード mbtoutf8.pch のみを
2+// 含むソース ファイルは、プリコンパイル済みヘッダーになります。
3+// stdafx.obj にはプリコンパイル済み型情報が含まれます。
4+
5+#include "stdafx.h"
6+
7+// TODO: このファイルではなく、STDAFX.H で必要な
8+// 追加ヘッダーを参照してください。
--- a/mbtoutf8/stdafx.h
+++ b/mbtoutf8/stdafx.h
@@ -1,19 +1,19 @@
1-// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
2-// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
3-// を記述します。
4-//
5-
6-#pragma once
7-
8-#include "targetver.h"
9-
10-#include <stdio.h>
11-#include <tchar.h>
12-
13-
14-
15-// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
16-
17-#include <locale.h>
18-#include <windows.h>
19-
1+// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
2+// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
3+// を記述します。
4+//
5+
6+#pragma once
7+
8+#include "targetver.h"
9+
10+#include <stdio.h>
11+#include <tchar.h>
12+
13+
14+
15+// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
16+
17+#include <locale.h>
18+#include <windows.h>
19+
--- a/mbtoutf8/targetver.h
+++ b/mbtoutf8/targetver.h
@@ -1,13 +1,13 @@
1-#pragma once
2-
3-// 以下のマクロは、最低限必要なプラットフォームを定義します。最低限必要なプラットフォームとは、
4-// アプリケーションを実行するために必要な機能を備えた最も古いバージョンの Windows や Internet Explorer など
5-// をいいます。これらのマクロは、指定したバージョンと、それ以前のバージョンのプラットフォーム上で利用できるすべての機能を有効にすることによって
6-// 動作します。
7-
8-// 下で指定された定義の前に対象プラットフォームを指定しなければならない場合、以下の定義を変更してください。
9-// 異なるプラットフォームに対応する値に関する最新情報については、MSDN を参照してください。
10-#ifndef _WIN32_WINNT // 最低限必要なプラットフォームが Windows Vista であることを指定します。
11-#define _WIN32_WINNT 0x0600 // これを Windows の他のバージョン向けに適切な値に変更してください。
12-#endif
13-
1+#pragma once
2+
3+// 以下のマクロは、最低限必要なプラットフォームを定義します。最低限必要なプラットフォームとは、
4+// アプリケーションを実行するために必要な機能を備えた最も古いバージョンの Windows や Internet Explorer など
5+// をいいます。これらのマクロは、指定したバージョンと、それ以前のバージョンのプラットフォーム上で利用できるすべての機能を有効にすることによって
6+// 動作します。
7+
8+// 下で指定された定義の前に対象プラットフォームを指定しなければならない場合、以下の定義を変更してください。
9+// 異なるプラットフォームに対応する値に関する最新情報については、MSDN を参照してください。
10+#ifndef _WIN32_WINNT // 最低限必要なプラットフォームが Windows Vista であることを指定します。
11+#define _WIN32_WINNT 0x0600 // これを Windows の他のバージョン向けに適切な値に変更してください。
12+#endif
13+
--- a/protectprocess.c
+++ b/protectprocess.c
@@ -1,1091 +1,1091 @@
1-// protectprocess.c
2-// Copyright (C) 2011 Suguru Kawamoto
3-// プロセスの保護
4-
5-// 次の中から1個のみ有効にする
6-// フック先の関数のコードを書き換える
7-// 全ての呼び出しをフック可能だが原理的に二重呼び出しに対応できない
8-#define USE_CODE_HOOK
9-// フック先の関数のインポートアドレステーブルを書き換える
10-// 二重呼び出しが可能だが呼び出し方法によってはフックを回避される
11-//#define USE_IAT_HOOK
12-
13-// フック対象の関数名 %s
14-// フック対象の型 _%s
15-// フック対象のポインタ p_%s
16-// フック用の関数名 h_%s
17-// フック対象のコードのバックアップ c_%s
18-
19-#include <tchar.h>
20-#include <windows.h>
21-#include <ntsecapi.h>
22-#include <wincrypt.h>
23-#include <wintrust.h>
24-#include <softpub.h>
25-#include <aclapi.h>
26-#include <sfc.h>
27-#include <tlhelp32.h>
28-#include <imagehlp.h>
29-#ifdef USE_IAT_HOOK
30-#include <dbghelp.h>
31-#endif
32-
33-#define DO_NOT_REPLACE
34-#include "protectprocess.h"
35-#include "mbswrapper.h"
36-
37-#ifdef USE_IAT_HOOK
38-#pragma comment(lib, "dbghelp.lib")
39-#endif
40-
41-#ifdef USE_CODE_HOOK
42-#if defined(_X86_)
43-#define HOOK_JUMP_CODE_LENGTH 5
44-#elif defined(_AMD64_)
45-#define HOOK_JUMP_CODE_LENGTH 14
46-#endif
47-#endif
48-
49-BOOL LockThreadLock();
50-BOOL UnlockThreadLock();
51-#ifdef USE_CODE_HOOK
52-BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore);
53-#endif
54-#ifdef USE_IAT_HOOK
55-BOOL HookFunctionInIAT(void* pOriginal, void* pNew);
56-#endif
57-HANDLE LockExistingFile(LPCWSTR Filename);
58-BOOL FindTrustedModuleSHA1Hash(void* pHash);
59-BOOL VerifyFileSignature(LPCWSTR Filename);
60-BOOL VerifyFileSignatureInCatalog(LPCWSTR Catalog, LPCWSTR Filename);
61-BOOL GetSHA1HashOfModule(LPCWSTR Filename, void* pHash);
62-BOOL IsModuleTrusted(LPCWSTR Filename);
63-
64-// 変数の宣言
65-#ifdef USE_CODE_HOOK
66-#define HOOK_FUNCTION_VAR(name) _##name p_##name;BYTE c_##name[HOOK_JUMP_CODE_LENGTH * 2];
67-#endif
68-#ifdef USE_IAT_HOOK
69-#define HOOK_FUNCTION_VAR(name) _##name p_##name;
70-#endif
71-// 関数ポインタを取得
72-#define GET_FUNCTION(h, name) p_##name = (_##name)GetProcAddress(h, #name)
73-// フック対象のコードを置換してフックを開始
74-#define SET_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, FALSE)
75-// フック対象を呼び出す前に対象のコードを復元
76-#define START_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE)
77-// フック対象を呼び出した後に対象のコードを置換
78-#define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, NULL, FALSE)
79-
80-HOOK_FUNCTION_VAR(LoadLibraryA)
81-HOOK_FUNCTION_VAR(LoadLibraryW)
82-HOOK_FUNCTION_VAR(LoadLibraryExA)
83-HOOK_FUNCTION_VAR(LoadLibraryExW)
84-
85-typedef NTSTATUS (NTAPI* _LdrLoadDll)(LPCWSTR, DWORD*, UNICODE_STRING*, HMODULE*);
86-typedef NTSTATUS (NTAPI* _LdrGetDllHandle)(LPCWSTR, DWORD*, UNICODE_STRING*, HMODULE*);
87-typedef PIMAGE_NT_HEADERS (NTAPI* _RtlImageNtHeader)(PVOID);
88-typedef BOOL (WINAPI* _CryptCATAdminCalcHashFromFileHandle)(HANDLE, DWORD*, BYTE*, DWORD);
89-
90-_LdrLoadDll p_LdrLoadDll;
91-_LdrGetDllHandle p_LdrGetDllHandle;
92-_RtlImageNtHeader p_RtlImageNtHeader;
93-_CryptCATAdminCalcHashFromFileHandle p_CryptCATAdminCalcHashFromFileHandle;
94-
95-#define MAX_LOCKED_THREAD 16
96-#define MAX_TRUSTED_FILENAME_TABLE 16
97-#define MAX_TRUSTED_MD5_HASH_TABLE 16
98-
99-DWORD g_ProcessProtectionLevel;
100-DWORD g_LockedThread[MAX_LOCKED_THREAD];
101-WCHAR* g_pTrustedFilenameTable[MAX_TRUSTED_FILENAME_TABLE];
102-BYTE g_TrustedMD5HashTable[MAX_TRUSTED_MD5_HASH_TABLE][20];
103-
104-// 以下フック関数
105-// フック対象を呼び出す場合は前後でSTART_HOOK_FUNCTIONとEND_HOOK_FUNCTIONを実行する必要がある
106-
107-HMODULE WINAPI h_LoadLibraryA(LPCSTR lpLibFileName)
108-{
109- HMODULE r = NULL;
110- wchar_t* pw0 = NULL;
111- if(pw0 = DuplicateAtoW(lpLibFileName, -1))
112- r = LoadLibraryExW(pw0, NULL, 0);
113- FreeDuplicatedString(pw0);
114- return r;
115-}
116-
117-HMODULE WINAPI h_LoadLibraryW(LPCWSTR lpLibFileName)
118-{
119- HMODULE r = NULL;
120- r = LoadLibraryExW(lpLibFileName, NULL, 0);
121- return r;
122-}
123-
124-HMODULE WINAPI h_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
125-{
126- HMODULE r = NULL;
127- wchar_t* pw0 = NULL;
128- if(pw0 = DuplicateAtoW(lpLibFileName, -1))
129- r = LoadLibraryExW(pw0, hFile, dwFlags);
130- FreeDuplicatedString(pw0);
131- return r;
132-}
133-
134-HMODULE WINAPI h_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
135-{
136- HMODULE r = NULL;
137- BOOL bTrusted;
138- wchar_t* pw0;
139- HANDLE hLock;
140- HMODULE hModule;
141- DWORD Length;
142- bTrusted = FALSE;
143- pw0 = NULL;
144- hLock = NULL;
145-// if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE))
146- if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE | 0x00000020 | 0x00000040))
147- bTrusted = TRUE;
148- if(!bTrusted)
149- {
150- if(hModule = System_LoadLibrary(lpLibFileName, NULL, DONT_RESOLVE_DLL_REFERENCES))
151- {
152- Length = MAX_PATH;
153- if(pw0 = AllocateStringW(Length))
154- {
155- if(GetModuleFileNameW(hModule, pw0, Length) > 0)
156- {
157- while(pw0)
158- {
159- if(GetModuleFileNameW(hModule, pw0, Length) + 1 <= Length)
160- {
161- lpLibFileName = pw0;
162- break;
163- }
164- Length = Length * 2;
165- FreeDuplicatedString(pw0);
166- pw0 = AllocateStringW(Length);
167- }
168- }
169- }
170- hLock = LockExistingFile(lpLibFileName);
171- FreeLibrary(hModule);
172- }
173- if((g_ProcessProtectionLevel & PROCESS_PROTECTION_LOADED) && GetModuleHandleW(lpLibFileName))
174- bTrusted = TRUE;
175- }
176- if(!bTrusted)
177- {
178- if(hLock)
179- {
180- if(IsModuleTrusted(lpLibFileName))
181- bTrusted = TRUE;
182- }
183- }
184- if(bTrusted)
185- r = System_LoadLibrary(lpLibFileName, hFile, dwFlags);
186- FreeDuplicatedString(pw0);
187- if(hLock)
188- CloseHandle(hLock);
189- return r;
190-}
191-
192-// 以下ヘルパー関数
193-
194-BOOL LockThreadLock()
195-{
196- BOOL bResult;
197- DWORD ThreadId;
198- DWORD i;
199- bResult = FALSE;
200- ThreadId = GetCurrentThreadId();
201- i = 0;
202- while(i < MAX_LOCKED_THREAD)
203- {
204- if(g_LockedThread[i] == ThreadId)
205- break;
206- i++;
207- }
208- if(i >= MAX_LOCKED_THREAD)
209- {
210- i = 0;
211- while(i < MAX_LOCKED_THREAD)
212- {
213- if(g_LockedThread[i] == 0)
214- {
215- g_LockedThread[i] = ThreadId;
216- bResult = TRUE;
217- break;
218- }
219- i++;
220- }
221- }
222- return bResult;
223-}
224-
225-BOOL UnlockThreadLock()
226-{
227- BOOL bResult;
228- DWORD ThreadId;
229- DWORD i;
230- bResult = FALSE;
231- ThreadId = GetCurrentThreadId();
232- i = 0;
233- while(i < MAX_LOCKED_THREAD)
234- {
235- if(g_LockedThread[i] == ThreadId)
236- {
237- g_LockedThread[i] = 0;
238- bResult = TRUE;
239- break;
240- }
241- i++;
242- }
243- return bResult;
244-}
245-
246-#ifdef USE_CODE_HOOK
247-BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore)
248-{
249- BOOL bResult;
250- DWORD Protect;
251-#if defined(_X86_)
252- BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xe9, 0x00, 0x00, 0x00, 0x00};
253- size_t Relative;
254- Relative = (size_t)pNew - (size_t)pOriginal - HOOK_JUMP_CODE_LENGTH;
255- memcpy(&JumpCode[1], &Relative, 4);
256- bResult = FALSE;
257- if(bRestore)
258- {
259- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
260- {
261- memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);
262- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
263- bResult = TRUE;
264- }
265- }
266- else
267- {
268- if(pBackupCode)
269- memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);
270- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
271- {
272- memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);
273- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
274- bResult = TRUE;
275- }
276- }
277-#elif defined(_AMD64_)
278- BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
279- size_t Absolute;
280- Absolute = (size_t)pOriginal;
281- memcpy(&JumpCode[6], &Absolute, 8);
282- bResult = FALSE;
283- if(bRestore)
284- {
285- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
286- {
287- memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);
288- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
289- bResult = TRUE;
290- }
291- }
292- else
293- {
294- if(pBackupCode)
295- memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);
296- if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
297- {
298- memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);
299- VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
300- bResult = TRUE;
301- }
302- }
303-#endif
304- return bResult;
305-}
306-#endif
307-
308-#ifdef USE_IAT_HOOK
309-BOOL HookFunctionInIAT(void* pOriginal, void* pNew)
310-{
311- BOOL bResult;
312- HANDLE hSnapshot;
313- MODULEENTRY32 me;
314- BOOL bFound;
315- IMAGE_IMPORT_DESCRIPTOR* piid;
316- ULONG Size;
317- IMAGE_THUNK_DATA* pitd;
318- DWORD Protect;
319- bResult = FALSE;
320- if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId())) != INVALID_HANDLE_VALUE)
321- {
322- me.dwSize = sizeof(MODULEENTRY32);
323- if(Module32First(hSnapshot, &me))
324- {
325- bFound = FALSE;
326- do
327- {
328- if(piid = (IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(me.hModule, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &Size))
329- {
330- while(!bFound && piid->Name != 0)
331- {
332- pitd = (IMAGE_THUNK_DATA*)((BYTE*)me.hModule + piid->FirstThunk);
333- while(!bFound && pitd->u1.Function != 0)
334- {
335- if((void*)pitd->u1.Function == pOriginal)
336- {
337- bFound = TRUE;
338- if(VirtualProtect(&pitd->u1.Function, sizeof(void*), PAGE_EXECUTE_READWRITE, &Protect))
339- {
340- memcpy(&pitd->u1.Function, &pNew, sizeof(void*));
341- VirtualProtect(&pitd->u1.Function, sizeof(void*), Protect, &Protect);
342- bResult = TRUE;
343- }
344- }
345- pitd++;
346- }
347- piid++;
348- }
349- }
350- }
351- while(!bFound && Module32Next(hSnapshot, &me));
352- }
353- CloseHandle(hSnapshot);
354- }
355- return bResult;
356-}
357-#endif
358-
359-// ファイルを変更不能に設定
360-HANDLE LockExistingFile(LPCWSTR Filename)
361-{
362- HANDLE hResult;
363- hResult = NULL;
364- if((hResult = CreateFileW(Filename, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)) == INVALID_HANDLE_VALUE)
365- hResult = NULL;
366- return hResult;
367-}
368-
369-// DLLのハッシュを検索
370-BOOL FindTrustedModuleSHA1Hash(void* pHash)
371-{
372- BOOL bResult;
373- int i;
374- bResult = FALSE;
375- i = 0;
376- while(i < MAX_TRUSTED_MD5_HASH_TABLE)
377- {
378- if(memcmp(&g_TrustedMD5HashTable[i], pHash, 20) == 0)
379- {
380- bResult = TRUE;
381- break;
382- }
383- i++;
384- }
385- return bResult;
386-}
387-
388-BOOL VerifyFileSignature_Function(LPCWSTR Filename)
389-{
390- BOOL bResult;
391- HCERTSTORE hStore;
392- PCCERT_CONTEXT pcc;
393- CERT_CHAIN_PARA ccp;
394- CERT_CHAIN_CONTEXT* pccc;
395- CERT_CHAIN_POLICY_PARA ccpp;
396- CERT_CHAIN_POLICY_STATUS ccps;
397- bResult = FALSE;
398- if(CryptQueryObject(CERT_QUERY_OBJECT_FILE, Filename, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, &hStore, NULL, NULL))
399- {
400- pcc = NULL;
401- while(!bResult && (pcc = CertEnumCertificatesInStore(hStore, pcc)))
402- {
403- ZeroMemory(&ccp, sizeof(CERT_CHAIN_PARA));
404- ccp.cbSize = sizeof(CERT_CHAIN_PARA);
405- if(CertGetCertificateChain(NULL, pcc, NULL, NULL, &ccp, 0, NULL, &pccc))
406- {
407- ZeroMemory(&ccpp, sizeof(CERT_CHAIN_POLICY_PARA));
408- ccpp.cbSize = sizeof(CERT_CHAIN_POLICY_PARA);
409- if(g_ProcessProtectionLevel & PROCESS_PROTECTION_EXPIRED)
410- ccpp.dwFlags |= CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG;
411- else if(g_ProcessProtectionLevel & PROCESS_PROTECTION_UNAUTHORIZED)
412- ccpp.dwFlags |= CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG;
413- ZeroMemory(&ccps, sizeof(CERT_CHAIN_POLICY_STATUS));
414- ccps.cbSize = sizeof(CERT_CHAIN_POLICY_STATUS);
415- if(CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_AUTHENTICODE, pccc, &ccpp, &ccps))
416- {
417- if(ccps.dwError == ERROR_SUCCESS)
418- {
419- bResult = TRUE;
420- break;
421- }
422- }
423- CertFreeCertificateChain(pccc);
424- }
425- }
426- while(pcc = CertEnumCertificatesInStore(hStore, pcc))
427- {
428- }
429- CertCloseStore(hStore, 0);
430- }
431- return bResult;
432-}
433-
434-// ファイルの署名を確認
435-BOOL VerifyFileSignature(LPCWSTR Filename)
436-{
437- BOOL bResult;
438- GUID g = WINTRUST_ACTION_GENERIC_VERIFY_V2;
439- WINTRUST_FILE_INFO wfi;
440- WINTRUST_DATA wd;
441- bResult = FALSE;
442- ZeroMemory(&wfi, sizeof(WINTRUST_FILE_INFO));
443- wfi.cbStruct = sizeof(WINTRUST_FILE_INFO);
444- wfi.pcwszFilePath = Filename;
445- ZeroMemory(&wd, sizeof(WINTRUST_DATA));
446- wd.cbStruct = sizeof(WINTRUST_DATA);
447- wd.dwUIChoice = WTD_UI_NONE;
448- wd.dwUnionChoice = WTD_CHOICE_FILE;
449- wd.pFile = &wfi;
450- if(WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &g, &wd) == ERROR_SUCCESS)
451- bResult = TRUE;
452- else
453- bResult = VerifyFileSignature_Function(Filename);
454- return bResult;
455-}
456-
457-// ファイルの署名をカタログファイルで確認
458-BOOL VerifyFileSignatureInCatalog(LPCWSTR Catalog, LPCWSTR Filename)
459-{
460- BOOL bResult;
461- GUID g = WINTRUST_ACTION_GENERIC_VERIFY_V2;
462- WINTRUST_CATALOG_INFO wci;
463- WINTRUST_DATA wd;
464- bResult = FALSE;
465- if(VerifyFileSignature(Catalog))
466- {
467- ZeroMemory(&wci, sizeof(WINTRUST_CATALOG_INFO));
468- wci.cbStruct = sizeof(WINTRUST_CATALOG_INFO);
469- wci.pcwszCatalogFilePath = Catalog;
470- wci.pcwszMemberFilePath = Filename;
471- if((wci.hMemberFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
472- {
473- p_CryptCATAdminCalcHashFromFileHandle(wci.hMemberFile, &wci.cbCalculatedFileHash, NULL, 0);
474- if(wci.pbCalculatedFileHash = (BYTE*)malloc(wci.cbCalculatedFileHash))
475- {
476- if(p_CryptCATAdminCalcHashFromFileHandle(wci.hMemberFile, &wci.cbCalculatedFileHash, wci.pbCalculatedFileHash, 0))
477- {
478- ZeroMemory(&wd, sizeof(WINTRUST_DATA));
479- wd.cbStruct = sizeof(WINTRUST_DATA);
480- wd.dwUIChoice = WTD_UI_NONE;
481- wd.dwUnionChoice = WTD_CHOICE_CATALOG;
482- wd.pCatalog = &wci;
483- if(WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &g, &wd) == ERROR_SUCCESS)
484- bResult = TRUE;
485- }
486- free(wci.pbCalculatedFileHash);
487- }
488- CloseHandle(wci.hMemberFile);
489- }
490- }
491- return bResult;
492-}
493-
494-BOOL WINAPI GetSHA1HashOfModule_Function(DIGEST_HANDLE refdata, PBYTE pData, DWORD dwLength)
495-{
496- return CryptHashData(*(HCRYPTHASH*)refdata, pData, dwLength, 0);
497-}
498-
499-// モジュールのSHA1ハッシュを取得
500-// マニフェストファイルのfile要素のhash属性は実行可能ファイルの場合にImageGetDigestStreamで算出される
501-BOOL GetSHA1HashOfModule(LPCWSTR Filename, void* pHash)
502-{
503- BOOL bResult;
504- HCRYPTPROV hProv;
505- HCRYPTHASH hHash;
506- HANDLE hFile;
507- DWORD dw;
508- bResult = FALSE;
509- if(CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, 0) || CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
510- {
511- if(CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
512- {
513- if((hFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
514- {
515- if(ImageGetDigestStream(hFile, CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO, GetSHA1HashOfModule_Function, (DIGEST_HANDLE)&hHash))
516- {
517- dw = 20;
518- if(CryptGetHashParam(hHash, HP_HASHVAL, (BYTE*)pHash, &dw, 0))
519- bResult = TRUE;
520- }
521- CloseHandle(hFile);
522- }
523- CryptDestroyHash(hHash);
524- }
525- CryptReleaseContext(hProv, 0);
526- }
527- return bResult;
528-}
529-
530-BOOL IsSxsModuleTrusted_Function(LPCWSTR Catalog, LPCWSTR Manifest, LPCWSTR Module)
531-{
532- BOOL bResult;
533- HANDLE hLock0;
534- HANDLE hLock1;
535- BYTE Hash[20];
536- int i;
537- static char HexTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
538- char HashHex[41];
539- HANDLE hFile;
540- DWORD Size;
541- char* pData;
542- DWORD dw;
543- bResult = FALSE;
544- if(hLock0 = LockExistingFile(Catalog))
545- {
546- if(hLock1 = LockExistingFile(Manifest))
547- {
548- if(VerifyFileSignatureInCatalog(Catalog, Manifest))
549- {
550- if(GetSHA1HashOfModule(Module, &Hash))
551- {
552- for(i = 0; i < 20; i++)
553- {
554- HashHex[i * 2] = HexTable[(Hash[i] >> 4) & 0x0f];
555- HashHex[i * 2 + 1] = HexTable[Hash[i] & 0x0f];
556- }
557- HashHex[i * 2] = '\0';
558- if((hFile = CreateFileW(Manifest, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
559- {
560- Size = GetFileSize(hFile, NULL);
561- if(pData = (char*)VirtualAlloc(NULL, Size + 1, MEM_COMMIT, PAGE_READWRITE))
562- {
563- VirtualLock(pData, Size + 1);
564- if(ReadFile(hFile, pData, Size, &dw, NULL))
565- {
566- pData[dw] = '\0';
567- if(strstr(pData, HashHex))
568- bResult = TRUE;
569- }
570- VirtualUnlock(pData, Size + 1);
571- VirtualFree(pData, Size + 1, MEM_DECOMMIT);
572- }
573- CloseHandle(hFile);
574- }
575- }
576- }
577- CloseHandle(hLock1);
578- }
579- CloseHandle(hLock0);
580- }
581- return bResult;
582-}
583-
584-// サイドバイサイドDLLを確認
585-// パスは"%SystemRoot%\WinSxS"以下を想定
586-// 以下のファイルが存在するものとする
587-// "\xxx\yyy.dll"、"\manifests\xxx.cat"、"\manifests\xxx.manifest"のセット(XPの全てのDLL、Vista以降の一部のDLL)
588-// "\xxx\yyy.dll"、"\catalogs\zzz.cat"、"\manifests\xxx.manifest"のセット(Vista以降のほとんどのDLL)
589-// 署名されたカタログファイルを用いてマニフェストファイルが改竄されていないことを確認
590-// ハッシュ値は マニフェストファイルのfile要素のhash属性に記述されているものを用いる
591-// マニフェストファイル内にSHA1ハッシュ値の16進数表記を直接検索しているが確率的に問題なし
592-BOOL IsSxsModuleTrusted(LPCWSTR Filename)
593-{
594- BOOL bResult;
595- wchar_t* pw0;
596- wchar_t* pw1;
597- wchar_t* pw2;
598- wchar_t* pw3;
599- wchar_t* pw4;
600- wchar_t* pw5;
601- wchar_t* p;
602- HANDLE hFind;
603- WIN32_FIND_DATAW wfd;
604- bResult = FALSE;
605- if(pw0 = AllocateStringW(wcslen(Filename) + 1))
606- {
607- wcscpy(pw0, Filename);
608- if(p = wcsrchr(pw0, L'\\'))
609- {
610- wcscpy(p, L"");
611- if(p = wcsrchr(pw0, L'\\'))
612- {
613- p++;
614- if(pw1 = AllocateStringW(wcslen(p) + 1))
615- {
616- wcscpy(pw1, p);
617- wcscpy(p, L"");
618- if(pw2 = AllocateStringW(wcslen(pw0) + wcslen(L"manifests\\") + wcslen(pw1) + wcslen(L".cat") + 1))
619- {
620- wcscpy(pw2, pw0);
621- wcscat(pw2, L"manifests\\");
622- wcscat(pw2, pw1);
623- if(pw3 = AllocateStringW(wcslen(pw2) + wcslen(L".manifest") + 1))
624- {
625- wcscpy(pw3, pw2);
626- wcscat(pw3, L".manifest");
627- wcscat(pw2, L".cat");
628- if(IsSxsModuleTrusted_Function(pw2, pw3, Filename))
629- bResult = TRUE;
630- FreeDuplicatedString(pw3);
631- }
632- FreeDuplicatedString(pw2);
633- }
634- if(!bResult)
635- {
636- if(pw2 = AllocateStringW(wcslen(pw0) + wcslen(L"catalogs\\") + 1))
637- {
638- if(pw3 = AllocateStringW(wcslen(pw0) + wcslen(L"manifests\\") + wcslen(pw1) + wcslen(L".manifest") + 1))
639- {
640- wcscpy(pw2, pw0);
641- wcscat(pw2, L"catalogs\\");
642- wcscpy(pw3, pw0);
643- wcscat(pw3, L"manifests\\");
644- wcscat(pw3, pw1);
645- wcscat(pw3, L".manifest");
646- if(pw4 = AllocateStringW(wcslen(pw2) + wcslen(L"*.cat") + 1))
647- {
648- wcscpy(pw4, pw2);
649- wcscat(pw4, L"*.cat");
650- if((hFind = FindFirstFileW(pw4, &wfd)) != INVALID_HANDLE_VALUE)
651- {
652- do
653- {
654- if(pw5 = AllocateStringW(wcslen(pw2) + wcslen(wfd.cFileName) + 1))
655- {
656- wcscpy(pw5, pw2);
657- wcscat(pw5, wfd.cFileName);
658- if(IsSxsModuleTrusted_Function(pw5, pw3, Filename))
659- bResult = TRUE;
660- FreeDuplicatedString(pw5);
661- }
662- }
663- while(!bResult && FindNextFileW(hFind, &wfd));
664- FindClose(hFind);
665- }
666- FreeDuplicatedString(pw4);
667- }
668- FreeDuplicatedString(pw3);
669- }
670- FreeDuplicatedString(pw2);
671- }
672- }
673- FreeDuplicatedString(pw1);
674- }
675- }
676- }
677- FreeDuplicatedString(pw0);
678- }
679- return bResult;
680-}
681-
682-// DLLを確認
683-BOOL IsModuleTrusted(LPCWSTR Filename)
684-{
685- BOOL bResult;
686- BYTE Hash[20];
687- bResult = FALSE;
688- if(LockThreadLock())
689- {
690- if(GetSHA1HashOfFile(Filename, &Hash))
691- {
692- if(FindTrustedModuleSHA1Hash(&Hash))
693- bResult = TRUE;
694- }
695- if(!bResult)
696- {
697- if((g_ProcessProtectionLevel & PROCESS_PROTECTION_BUILTIN) && VerifyFileSignature(Filename))
698- bResult = TRUE;
699- }
700- if(!bResult)
701- {
702- if((g_ProcessProtectionLevel & PROCESS_PROTECTION_SIDE_BY_SIDE) && IsSxsModuleTrusted(Filename))
703- bResult = TRUE;
704- }
705- if(!bResult)
706- {
707- if((g_ProcessProtectionLevel & PROCESS_PROTECTION_SYSTEM_FILE) && SfcIsFileProtected(NULL, Filename))
708- bResult = TRUE;
709- }
710- UnlockThreadLock();
711- }
712- return bResult;
713-}
714-
715-// kernel32.dllのLoadLibraryExW相当の関数
716-// ドキュメントが無いため詳細は不明
717-// 一部のウィルス対策ソフト(Avast!等)がLdrLoadDllをフックしているためLdrLoadDllを書き換えるべきではない
718-// カーネルモードのコードに対しては効果なし
719-// SeDebugPrivilegeが使用可能なユーザーに対しては効果なし
720-HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
721-{
722- HMODULE r = NULL;
723- UNICODE_STRING us;
724- HANDLE hDataFile;
725- HANDLE hMapping;
726- DWORD DllFlags;
727- us.Length = sizeof(wchar_t) * wcslen(lpLibFileName);
728- us.MaximumLength = sizeof(wchar_t) * (wcslen(lpLibFileName) + 1);
729- us.Buffer = (PWSTR)lpLibFileName;
730-// if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE))
731- if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | 0x00000040))
732- {
733-// if(p_LdrGetDllHandle(NULL, NULL, &us, &r) == STATUS_SUCCESS)
734- if(p_LdrGetDllHandle(NULL, NULL, &us, &r) == 0)
735- {
736-// dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE);
737- dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | 0x00000040);
738- dwFlags |= DONT_RESOLVE_DLL_REFERENCES;
739- }
740- else
741- {
742-// if(dwFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)
743- if(dwFlags & 0x00000040)
744- hDataFile = CreateFileW(lpLibFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
745- else
746- hDataFile = CreateFileW(lpLibFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
747- if(hDataFile != INVALID_HANDLE_VALUE)
748- {
749- if(hMapping = CreateFileMappingW(hDataFile, NULL, PAGE_READONLY, 0, 0, NULL))
750- {
751- if(r = (HMODULE)MapViewOfFileEx(hMapping, FILE_MAP_READ, 0, 0, 0, NULL))
752- {
753- if(p_RtlImageNtHeader(r))
754- r = (HMODULE)((size_t)r | 1);
755- else
756- {
757- UnmapViewOfFile(r);
758- r = NULL;
759- }
760- }
761- CloseHandle(hMapping);
762- }
763- CloseHandle(hDataFile);
764- }
765- else
766- {
767-// dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE);
768- dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | 0x00000040);
769- dwFlags |= DONT_RESOLVE_DLL_REFERENCES;
770- }
771- }
772- }
773-// if(!(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)))
774- if(!(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | 0x00000040)))
775- {
776- DllFlags = 0;
777-// if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_IMAGE_RESOURCE))
778- if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | 0x00000020))
779- DllFlags |= 0x00000002;
780-// if(p_LdrLoadDll(NULL, &DllFlags, &us, &r) == STATUS_SUCCESS)
781- if(p_LdrLoadDll(NULL, &DllFlags, &us, &r) == 0)
782- {
783- }
784- else
785- r = NULL;
786- }
787- return r;
788-}
789-
790-void SetProcessProtectionLevel(DWORD Level)
791-{
792- g_ProcessProtectionLevel = Level;
793-}
794-
795-// ファイルのSHA1ハッシュを取得
796-BOOL GetSHA1HashOfFile(LPCWSTR Filename, void* pHash)
797-{
798- BOOL bResult;
799- HCRYPTPROV hProv;
800- HCRYPTHASH hHash;
801- HANDLE hFile;
802- DWORD Size;
803- void* pData;
804- DWORD dw;
805- bResult = FALSE;
806- if(CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, 0) || CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
807- {
808- if(CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
809- {
810- if((hFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
811- {
812- Size = GetFileSize(hFile, NULL);
813- if(pData = VirtualAlloc(NULL, Size, MEM_COMMIT, PAGE_READWRITE))
814- {
815- VirtualLock(pData, Size);
816- if(ReadFile(hFile, pData, Size, &dw, NULL))
817- {
818- if(CryptHashData(hHash, (BYTE*)pData, Size, 0))
819- {
820- dw = 20;
821- if(CryptGetHashParam(hHash, HP_HASHVAL, (BYTE*)pHash, &dw, 0))
822- bResult = TRUE;
823- }
824- }
825- VirtualUnlock(pData, Size);
826- VirtualFree(pData, Size, MEM_DECOMMIT);
827- }
828- CloseHandle(hFile);
829- }
830- CryptDestroyHash(hHash);
831- }
832- CryptReleaseContext(hProv, 0);
833- }
834- return bResult;
835-}
836-
837-// DLLのハッシュを登録
838-BOOL RegisterTrustedModuleSHA1Hash(void* pHash)
839-{
840- BOOL bResult;
841- BYTE NullHash[20] = {0};
842- int i;
843- bResult = FALSE;
844- if(FindTrustedModuleSHA1Hash(pHash))
845- bResult = TRUE;
846- else
847- {
848- i = 0;
849- while(i < MAX_TRUSTED_MD5_HASH_TABLE)
850- {
851- if(memcmp(&g_TrustedMD5HashTable[i], &NullHash, 20) == 0)
852- {
853- memcpy(&g_TrustedMD5HashTable[i], pHash, 20);
854- bResult = TRUE;
855- break;
856- }
857- i++;
858- }
859- }
860- return bResult;
861-}
862-
863-// DLLのハッシュの登録を解除
864-BOOL UnregisterTrustedModuleSHA1Hash(void* pHash)
865-{
866- BOOL bResult;
867- BYTE NullHash[20] = {0};
868- int i;
869- bResult = FALSE;
870- i = 0;
871- while(i < MAX_TRUSTED_MD5_HASH_TABLE)
872- {
873- if(memcmp(&g_TrustedMD5HashTable[i], pHash, 20) == 0)
874- {
875- memcpy(&g_TrustedMD5HashTable[i], &NullHash, 20);
876- bResult = TRUE;
877- break;
878- }
879- i++;
880- }
881- return bResult;
882-}
883-
884-// 信頼できないDLLをアンロード
885-BOOL UnloadUntrustedModule()
886-{
887- BOOL bResult;
888- wchar_t* pw0;
889- HANDLE hSnapshot;
890- MODULEENTRY32 me;
891- DWORD Length;
892- bResult = FALSE;
893- pw0 = NULL;
894- if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId())) != INVALID_HANDLE_VALUE)
895- {
896- bResult = TRUE;
897- me.dwSize = sizeof(MODULEENTRY32);
898- if(Module32First(hSnapshot, &me))
899- {
900- do
901- {
902- Length = MAX_PATH;
903- FreeDuplicatedString(pw0);
904- if(pw0 = AllocateStringW(Length))
905- {
906- if(GetModuleFileNameW(me.hModule, pw0, Length) > 0)
907- {
908- while(pw0)
909- {
910- if(GetModuleFileNameW(me.hModule, pw0, Length) + 1 <= Length)
911- break;
912- Length = Length * 2;
913- FreeDuplicatedString(pw0);
914- pw0 = AllocateStringW(Length);
915- }
916- }
917- }
918- if(pw0)
919- {
920- if(!IsModuleTrusted(pw0))
921- {
922- if(me.hModule != GetModuleHandleW(NULL))
923- {
924- while(FreeLibrary(me.hModule))
925- {
926- }
927- if(GetModuleFileNameW(me.hModule, pw0, Length) > 0)
928- {
929- bResult = FALSE;
930- break;
931- }
932- }
933- }
934- }
935- else
936- {
937- bResult = FALSE;
938- break;
939- }
940- }
941- while(Module32Next(hSnapshot, &me));
942- }
943- CloseHandle(hSnapshot);
944- }
945- FreeDuplicatedString(pw0);
946- return bResult;
947-}
948-
949-// 関数ポインタを使用可能な状態に初期化
950-BOOL InitializeLoadLibraryHook()
951-{
952- BOOL bResult;
953- HMODULE hModule;
954- bResult = TRUE;
955- if(!(hModule = GetModuleHandleW(L"kernel32.dll")))
956- bResult = FALSE;
957- if(!(GET_FUNCTION(hModule, LoadLibraryA)))
958- bResult = FALSE;
959- if(!(GET_FUNCTION(hModule, LoadLibraryW)))
960- bResult = FALSE;
961- if(!(GET_FUNCTION(hModule, LoadLibraryExA)))
962- bResult = FALSE;
963- if(!(GET_FUNCTION(hModule, LoadLibraryExW)))
964- bResult = FALSE;
965- if(!(hModule = GetModuleHandleW(L"ntdll.dll")))
966- bResult = FALSE;
967- if(!(GET_FUNCTION(hModule, LdrLoadDll)))
968- bResult = FALSE;
969- if(!(GET_FUNCTION(hModule, LdrGetDllHandle)))
970- bResult = FALSE;
971- if(!(GET_FUNCTION(hModule, RtlImageNtHeader)))
972- bResult = FALSE;
973- if(!(hModule = LoadLibraryW(L"wintrust.dll")))
974- bResult = FALSE;
975- if(!(GET_FUNCTION(hModule, CryptCATAdminCalcHashFromFileHandle)))
976- bResult = FALSE;
977- return bResult;
978-}
979-
980-// SetWindowsHookEx対策
981-// DLL Injectionされた場合は上のh_LoadLibrary系関数でトラップ可能
982-BOOL EnableLoadLibraryHook(BOOL bEnable)
983-{
984- BOOL bResult;
985- bResult = FALSE;
986- if(bEnable)
987- {
988- bResult = TRUE;
989-#ifdef USE_CODE_HOOK
990- if(!SET_HOOK_FUNCTION(LoadLibraryA))
991- bResult = FALSE;
992- if(!SET_HOOK_FUNCTION(LoadLibraryW))
993- bResult = FALSE;
994- if(!SET_HOOK_FUNCTION(LoadLibraryExA))
995- bResult = FALSE;
996- if(!SET_HOOK_FUNCTION(LoadLibraryExW))
997- bResult = FALSE;
998-#endif
999-#ifdef USE_IAT_HOOK
1000- if(!HookFunctionInIAT(p_LoadLibraryA, h_LoadLibraryA))
1001- bResult = FALSE;
1002- if(!HookFunctionInIAT(p_LoadLibraryW, h_LoadLibraryW))
1003- bResult = FALSE;
1004- if(!HookFunctionInIAT(p_LoadLibraryExA, h_LoadLibraryExA))
1005- bResult = FALSE;
1006- if(!HookFunctionInIAT(p_LoadLibraryExW, h_LoadLibraryExW))
1007- bResult = FALSE;
1008-#endif
1009- }
1010- else
1011- {
1012- bResult = TRUE;
1013-#ifdef USE_CODE_HOOK
1014- if(!END_HOOK_FUNCTION(LoadLibraryA))
1015- bResult = FALSE;
1016- if(!END_HOOK_FUNCTION(LoadLibraryW))
1017- bResult = FALSE;
1018- if(!END_HOOK_FUNCTION(LoadLibraryExA))
1019- bResult = FALSE;
1020- if(!END_HOOK_FUNCTION(LoadLibraryExW))
1021- bResult = FALSE;
1022-#endif
1023-#ifdef USE_IAT_HOOK
1024- if(!HookFunctionInIAT(h_LoadLibraryA, p_LoadLibraryA))
1025- bResult = FALSE;
1026- if(!HookFunctionInIAT(h_LoadLibraryW, p_LoadLibraryW))
1027- bResult = FALSE;
1028- if(!HookFunctionInIAT(h_LoadLibraryExA, p_LoadLibraryExA))
1029- bResult = FALSE;
1030- if(!HookFunctionInIAT(h_LoadLibraryExW, p_LoadLibraryExW))
1031- bResult = FALSE;
1032-#endif
1033- }
1034- return bResult;
1035-}
1036-
1037-// ReadProcessMemory、WriteProcessMemory、CreateRemoteThread対策
1038-// TerminateProcessのみ許可
1039-BOOL RestartProtectedProcess(LPCTSTR Keyword)
1040-{
1041- BOOL bResult;
1042- ACL* pACL;
1043- SID_IDENTIFIER_AUTHORITY sia = SECURITY_WORLD_SID_AUTHORITY;
1044- PSID pSID;
1045- SECURITY_DESCRIPTOR sd;
1046- TCHAR* CommandLine;
1047- SECURITY_ATTRIBUTES sa;
1048- STARTUPINFO si;
1049- PROCESS_INFORMATION pi;
1050- bResult = FALSE;
1051- if(_tcslen(GetCommandLine()) >= _tcslen(Keyword) && _tcscmp(GetCommandLine() + _tcslen(GetCommandLine()) - _tcslen(Keyword), Keyword) == 0)
1052- return FALSE;
1053- if(pACL = (ACL*)malloc(sizeof(ACL) + 1024))
1054- {
1055- if(InitializeAcl(pACL, sizeof(ACL) + 1024, ACL_REVISION))
1056- {
1057- if(AllocateAndInitializeSid(&sia, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSID))
1058- {
1059- if(AddAccessAllowedAce(pACL, ACL_REVISION, PROCESS_TERMINATE, pSID))
1060- {
1061- if(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
1062- {
1063- if(SetSecurityDescriptorDacl(&sd, TRUE, pACL, FALSE))
1064- {
1065- if(CommandLine = (TCHAR*)malloc(sizeof(TCHAR) * (_tcslen(GetCommandLine()) + _tcslen(Keyword) + 1)))
1066- {
1067- _tcscpy(CommandLine, GetCommandLine());
1068- _tcscat(CommandLine, Keyword);
1069- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
1070- sa.lpSecurityDescriptor = &sd;
1071- sa.bInheritHandle = FALSE;
1072- GetStartupInfo(&si);
1073- if(CreateProcess(NULL, CommandLine, &sa, NULL, FALSE, 0, NULL, NULL, &si, &pi))
1074- {
1075- CloseHandle(pi.hThread);
1076- CloseHandle(pi.hProcess);
1077- bResult = TRUE;
1078- }
1079- free(CommandLine);
1080- }
1081- }
1082- }
1083- }
1084- FreeSid(pSID);
1085- }
1086- }
1087- free(pACL);
1088- }
1089- return bResult;
1090-}
1091-
1+// protectprocess.c
2+// Copyright (C) 2011 Suguru Kawamoto
3+// プロセスの保護
4+
5+// 次の中から1個のみ有効にする
6+// フック先の関数のコードを書き換える
7+// 全ての呼び出しをフック可能だが原理的に二重呼び出しに対応できない
8+#define USE_CODE_HOOK
9+// フック先の関数のインポートアドレステーブルを書き換える
10+// 二重呼び出しが可能だが呼び出し方法によってはフックを回避される
11+//#define USE_IAT_HOOK
12+
13+// フック対象の関数名 %s
14+// フック対象の型 _%s
15+// フック対象のポインタ p_%s
16+// フック用の関数名 h_%s
17+// フック対象のコードのバックアップ c_%s
18+
19+#include <tchar.h>
20+#include <windows.h>
21+#include <ntsecapi.h>
22+#include <wincrypt.h>
23+#include <wintrust.h>
24+#include <softpub.h>
25+#include <aclapi.h>
26+#include <sfc.h>
27+#include <tlhelp32.h>
28+#include <imagehlp.h>
29+#ifdef USE_IAT_HOOK
30+#include <dbghelp.h>
31+#endif
32+
33+#define DO_NOT_REPLACE
34+#include "protectprocess.h"
35+#include "mbswrapper.h"
36+
37+#ifdef USE_IAT_HOOK
38+#pragma comment(lib, "dbghelp.lib")
39+#endif
40+
41+#ifdef USE_CODE_HOOK
42+#if defined(_X86_)
43+#define HOOK_JUMP_CODE_LENGTH 5
44+#elif defined(_AMD64_)
45+#define HOOK_JUMP_CODE_LENGTH 14
46+#endif
47+#endif
48+
49+BOOL LockThreadLock();
50+BOOL UnlockThreadLock();
51+#ifdef USE_CODE_HOOK
52+BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore);
53+#endif
54+#ifdef USE_IAT_HOOK
55+BOOL HookFunctionInIAT(void* pOriginal, void* pNew);
56+#endif
57+HANDLE LockExistingFile(LPCWSTR Filename);
58+BOOL FindTrustedModuleSHA1Hash(void* pHash);
59+BOOL VerifyFileSignature(LPCWSTR Filename);
60+BOOL VerifyFileSignatureInCatalog(LPCWSTR Catalog, LPCWSTR Filename);
61+BOOL GetSHA1HashOfModule(LPCWSTR Filename, void* pHash);
62+BOOL IsModuleTrusted(LPCWSTR Filename);
63+
64+// 変数の宣言
65+#ifdef USE_CODE_HOOK
66+#define HOOK_FUNCTION_VAR(name) _##name p_##name;BYTE c_##name[HOOK_JUMP_CODE_LENGTH * 2];
67+#endif
68+#ifdef USE_IAT_HOOK
69+#define HOOK_FUNCTION_VAR(name) _##name p_##name;
70+#endif
71+// 関数ポインタを取得
72+#define GET_FUNCTION(h, name) p_##name = (_##name)GetProcAddress(h, #name)
73+// フック対象のコードを置換してフックを開始
74+#define SET_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, FALSE)
75+// フック対象を呼び出す前に対象のコードを復元
76+#define START_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, &c_##name, TRUE)
77+// フック対象を呼び出した後に対象のコードを置換
78+#define END_HOOK_FUNCTION(name) HookFunctionInCode(p_##name, h_##name, NULL, FALSE)
79+
80+HOOK_FUNCTION_VAR(LoadLibraryA)
81+HOOK_FUNCTION_VAR(LoadLibraryW)
82+HOOK_FUNCTION_VAR(LoadLibraryExA)
83+HOOK_FUNCTION_VAR(LoadLibraryExW)
84+
85+typedef NTSTATUS (NTAPI* _LdrLoadDll)(LPCWSTR, DWORD*, UNICODE_STRING*, HMODULE*);
86+typedef NTSTATUS (NTAPI* _LdrGetDllHandle)(LPCWSTR, DWORD*, UNICODE_STRING*, HMODULE*);
87+typedef PIMAGE_NT_HEADERS (NTAPI* _RtlImageNtHeader)(PVOID);
88+typedef BOOL (WINAPI* _CryptCATAdminCalcHashFromFileHandle)(HANDLE, DWORD*, BYTE*, DWORD);
89+
90+_LdrLoadDll p_LdrLoadDll;
91+_LdrGetDllHandle p_LdrGetDllHandle;
92+_RtlImageNtHeader p_RtlImageNtHeader;
93+_CryptCATAdminCalcHashFromFileHandle p_CryptCATAdminCalcHashFromFileHandle;
94+
95+#define MAX_LOCKED_THREAD 16
96+#define MAX_TRUSTED_FILENAME_TABLE 16
97+#define MAX_TRUSTED_MD5_HASH_TABLE 16
98+
99+DWORD g_ProcessProtectionLevel;
100+DWORD g_LockedThread[MAX_LOCKED_THREAD];
101+WCHAR* g_pTrustedFilenameTable[MAX_TRUSTED_FILENAME_TABLE];
102+BYTE g_TrustedMD5HashTable[MAX_TRUSTED_MD5_HASH_TABLE][20];
103+
104+// 以下フック関数
105+// フック対象を呼び出す場合は前後でSTART_HOOK_FUNCTIONとEND_HOOK_FUNCTIONを実行する必要がある
106+
107+HMODULE WINAPI h_LoadLibraryA(LPCSTR lpLibFileName)
108+{
109+ HMODULE r = NULL;
110+ wchar_t* pw0 = NULL;
111+ if(pw0 = DuplicateAtoW(lpLibFileName, -1))
112+ r = LoadLibraryExW(pw0, NULL, 0);
113+ FreeDuplicatedString(pw0);
114+ return r;
115+}
116+
117+HMODULE WINAPI h_LoadLibraryW(LPCWSTR lpLibFileName)
118+{
119+ HMODULE r = NULL;
120+ r = LoadLibraryExW(lpLibFileName, NULL, 0);
121+ return r;
122+}
123+
124+HMODULE WINAPI h_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
125+{
126+ HMODULE r = NULL;
127+ wchar_t* pw0 = NULL;
128+ if(pw0 = DuplicateAtoW(lpLibFileName, -1))
129+ r = LoadLibraryExW(pw0, hFile, dwFlags);
130+ FreeDuplicatedString(pw0);
131+ return r;
132+}
133+
134+HMODULE WINAPI h_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
135+{
136+ HMODULE r = NULL;
137+ BOOL bTrusted;
138+ wchar_t* pw0;
139+ HANDLE hLock;
140+ HMODULE hModule;
141+ DWORD Length;
142+ bTrusted = FALSE;
143+ pw0 = NULL;
144+ hLock = NULL;
145+// if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE))
146+ if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE | 0x00000020 | 0x00000040))
147+ bTrusted = TRUE;
148+ if(!bTrusted)
149+ {
150+ if(hModule = System_LoadLibrary(lpLibFileName, NULL, DONT_RESOLVE_DLL_REFERENCES))
151+ {
152+ Length = MAX_PATH;
153+ if(pw0 = AllocateStringW(Length))
154+ {
155+ if(GetModuleFileNameW(hModule, pw0, Length) > 0)
156+ {
157+ while(pw0)
158+ {
159+ if(GetModuleFileNameW(hModule, pw0, Length) + 1 <= Length)
160+ {
161+ lpLibFileName = pw0;
162+ break;
163+ }
164+ Length = Length * 2;
165+ FreeDuplicatedString(pw0);
166+ pw0 = AllocateStringW(Length);
167+ }
168+ }
169+ }
170+ hLock = LockExistingFile(lpLibFileName);
171+ FreeLibrary(hModule);
172+ }
173+ if((g_ProcessProtectionLevel & PROCESS_PROTECTION_LOADED) && GetModuleHandleW(lpLibFileName))
174+ bTrusted = TRUE;
175+ }
176+ if(!bTrusted)
177+ {
178+ if(hLock)
179+ {
180+ if(IsModuleTrusted(lpLibFileName))
181+ bTrusted = TRUE;
182+ }
183+ }
184+ if(bTrusted)
185+ r = System_LoadLibrary(lpLibFileName, hFile, dwFlags);
186+ FreeDuplicatedString(pw0);
187+ if(hLock)
188+ CloseHandle(hLock);
189+ return r;
190+}
191+
192+// 以下ヘルパー関数
193+
194+BOOL LockThreadLock()
195+{
196+ BOOL bResult;
197+ DWORD ThreadId;
198+ DWORD i;
199+ bResult = FALSE;
200+ ThreadId = GetCurrentThreadId();
201+ i = 0;
202+ while(i < MAX_LOCKED_THREAD)
203+ {
204+ if(g_LockedThread[i] == ThreadId)
205+ break;
206+ i++;
207+ }
208+ if(i >= MAX_LOCKED_THREAD)
209+ {
210+ i = 0;
211+ while(i < MAX_LOCKED_THREAD)
212+ {
213+ if(g_LockedThread[i] == 0)
214+ {
215+ g_LockedThread[i] = ThreadId;
216+ bResult = TRUE;
217+ break;
218+ }
219+ i++;
220+ }
221+ }
222+ return bResult;
223+}
224+
225+BOOL UnlockThreadLock()
226+{
227+ BOOL bResult;
228+ DWORD ThreadId;
229+ DWORD i;
230+ bResult = FALSE;
231+ ThreadId = GetCurrentThreadId();
232+ i = 0;
233+ while(i < MAX_LOCKED_THREAD)
234+ {
235+ if(g_LockedThread[i] == ThreadId)
236+ {
237+ g_LockedThread[i] = 0;
238+ bResult = TRUE;
239+ break;
240+ }
241+ i++;
242+ }
243+ return bResult;
244+}
245+
246+#ifdef USE_CODE_HOOK
247+BOOL HookFunctionInCode(void* pOriginal, void* pNew, void* pBackupCode, BOOL bRestore)
248+{
249+ BOOL bResult;
250+ DWORD Protect;
251+#if defined(_X86_)
252+ BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xe9, 0x00, 0x00, 0x00, 0x00};
253+ size_t Relative;
254+ Relative = (size_t)pNew - (size_t)pOriginal - HOOK_JUMP_CODE_LENGTH;
255+ memcpy(&JumpCode[1], &Relative, 4);
256+ bResult = FALSE;
257+ if(bRestore)
258+ {
259+ if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
260+ {
261+ memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);
262+ VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
263+ bResult = TRUE;
264+ }
265+ }
266+ else
267+ {
268+ if(pBackupCode)
269+ memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);
270+ if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
271+ {
272+ memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);
273+ VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
274+ bResult = TRUE;
275+ }
276+ }
277+#elif defined(_AMD64_)
278+ BYTE JumpCode[HOOK_JUMP_CODE_LENGTH] = {0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
279+ size_t Absolute;
280+ Absolute = (size_t)pOriginal;
281+ memcpy(&JumpCode[6], &Absolute, 8);
282+ bResult = FALSE;
283+ if(bRestore)
284+ {
285+ if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
286+ {
287+ memcpy(pOriginal, pBackupCode, HOOK_JUMP_CODE_LENGTH);
288+ VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
289+ bResult = TRUE;
290+ }
291+ }
292+ else
293+ {
294+ if(pBackupCode)
295+ memcpy(pBackupCode, pOriginal, HOOK_JUMP_CODE_LENGTH);
296+ if(VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, PAGE_EXECUTE_READWRITE, &Protect))
297+ {
298+ memcpy(pOriginal, &JumpCode, HOOK_JUMP_CODE_LENGTH);
299+ VirtualProtect(pOriginal, HOOK_JUMP_CODE_LENGTH, Protect, &Protect);
300+ bResult = TRUE;
301+ }
302+ }
303+#endif
304+ return bResult;
305+}
306+#endif
307+
308+#ifdef USE_IAT_HOOK
309+BOOL HookFunctionInIAT(void* pOriginal, void* pNew)
310+{
311+ BOOL bResult;
312+ HANDLE hSnapshot;
313+ MODULEENTRY32 me;
314+ BOOL bFound;
315+ IMAGE_IMPORT_DESCRIPTOR* piid;
316+ ULONG Size;
317+ IMAGE_THUNK_DATA* pitd;
318+ DWORD Protect;
319+ bResult = FALSE;
320+ if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId())) != INVALID_HANDLE_VALUE)
321+ {
322+ me.dwSize = sizeof(MODULEENTRY32);
323+ if(Module32First(hSnapshot, &me))
324+ {
325+ bFound = FALSE;
326+ do
327+ {
328+ if(piid = (IMAGE_IMPORT_DESCRIPTOR*)ImageDirectoryEntryToData(me.hModule, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &Size))
329+ {
330+ while(!bFound && piid->Name != 0)
331+ {
332+ pitd = (IMAGE_THUNK_DATA*)((BYTE*)me.hModule + piid->FirstThunk);
333+ while(!bFound && pitd->u1.Function != 0)
334+ {
335+ if((void*)pitd->u1.Function == pOriginal)
336+ {
337+ bFound = TRUE;
338+ if(VirtualProtect(&pitd->u1.Function, sizeof(void*), PAGE_EXECUTE_READWRITE, &Protect))
339+ {
340+ memcpy(&pitd->u1.Function, &pNew, sizeof(void*));
341+ VirtualProtect(&pitd->u1.Function, sizeof(void*), Protect, &Protect);
342+ bResult = TRUE;
343+ }
344+ }
345+ pitd++;
346+ }
347+ piid++;
348+ }
349+ }
350+ }
351+ while(!bFound && Module32Next(hSnapshot, &me));
352+ }
353+ CloseHandle(hSnapshot);
354+ }
355+ return bResult;
356+}
357+#endif
358+
359+// ファイルを変更不能に設定
360+HANDLE LockExistingFile(LPCWSTR Filename)
361+{
362+ HANDLE hResult;
363+ hResult = NULL;
364+ if((hResult = CreateFileW(Filename, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)) == INVALID_HANDLE_VALUE)
365+ hResult = NULL;
366+ return hResult;
367+}
368+
369+// DLLのハッシュを検索
370+BOOL FindTrustedModuleSHA1Hash(void* pHash)
371+{
372+ BOOL bResult;
373+ int i;
374+ bResult = FALSE;
375+ i = 0;
376+ while(i < MAX_TRUSTED_MD5_HASH_TABLE)
377+ {
378+ if(memcmp(&g_TrustedMD5HashTable[i], pHash, 20) == 0)
379+ {
380+ bResult = TRUE;
381+ break;
382+ }
383+ i++;
384+ }
385+ return bResult;
386+}
387+
388+BOOL VerifyFileSignature_Function(LPCWSTR Filename)
389+{
390+ BOOL bResult;
391+ HCERTSTORE hStore;
392+ PCCERT_CONTEXT pcc;
393+ CERT_CHAIN_PARA ccp;
394+ CERT_CHAIN_CONTEXT* pccc;
395+ CERT_CHAIN_POLICY_PARA ccpp;
396+ CERT_CHAIN_POLICY_STATUS ccps;
397+ bResult = FALSE;
398+ if(CryptQueryObject(CERT_QUERY_OBJECT_FILE, Filename, CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, &hStore, NULL, NULL))
399+ {
400+ pcc = NULL;
401+ while(!bResult && (pcc = CertEnumCertificatesInStore(hStore, pcc)))
402+ {
403+ ZeroMemory(&ccp, sizeof(CERT_CHAIN_PARA));
404+ ccp.cbSize = sizeof(CERT_CHAIN_PARA);
405+ if(CertGetCertificateChain(NULL, pcc, NULL, NULL, &ccp, 0, NULL, &pccc))
406+ {
407+ ZeroMemory(&ccpp, sizeof(CERT_CHAIN_POLICY_PARA));
408+ ccpp.cbSize = sizeof(CERT_CHAIN_POLICY_PARA);
409+ if(g_ProcessProtectionLevel & PROCESS_PROTECTION_EXPIRED)
410+ ccpp.dwFlags |= CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG;
411+ else if(g_ProcessProtectionLevel & PROCESS_PROTECTION_UNAUTHORIZED)
412+ ccpp.dwFlags |= CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG;
413+ ZeroMemory(&ccps, sizeof(CERT_CHAIN_POLICY_STATUS));
414+ ccps.cbSize = sizeof(CERT_CHAIN_POLICY_STATUS);
415+ if(CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_AUTHENTICODE, pccc, &ccpp, &ccps))
416+ {
417+ if(ccps.dwError == ERROR_SUCCESS)
418+ {
419+ bResult = TRUE;
420+ break;
421+ }
422+ }
423+ CertFreeCertificateChain(pccc);
424+ }
425+ }
426+ while(pcc = CertEnumCertificatesInStore(hStore, pcc))
427+ {
428+ }
429+ CertCloseStore(hStore, 0);
430+ }
431+ return bResult;
432+}
433+
434+// ファイルの署名を確認
435+BOOL VerifyFileSignature(LPCWSTR Filename)
436+{
437+ BOOL bResult;
438+ GUID g = WINTRUST_ACTION_GENERIC_VERIFY_V2;
439+ WINTRUST_FILE_INFO wfi;
440+ WINTRUST_DATA wd;
441+ bResult = FALSE;
442+ ZeroMemory(&wfi, sizeof(WINTRUST_FILE_INFO));
443+ wfi.cbStruct = sizeof(WINTRUST_FILE_INFO);
444+ wfi.pcwszFilePath = Filename;
445+ ZeroMemory(&wd, sizeof(WINTRUST_DATA));
446+ wd.cbStruct = sizeof(WINTRUST_DATA);
447+ wd.dwUIChoice = WTD_UI_NONE;
448+ wd.dwUnionChoice = WTD_CHOICE_FILE;
449+ wd.pFile = &wfi;
450+ if(WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &g, &wd) == ERROR_SUCCESS)
451+ bResult = TRUE;
452+ else
453+ bResult = VerifyFileSignature_Function(Filename);
454+ return bResult;
455+}
456+
457+// ファイルの署名をカタログファイルで確認
458+BOOL VerifyFileSignatureInCatalog(LPCWSTR Catalog, LPCWSTR Filename)
459+{
460+ BOOL bResult;
461+ GUID g = WINTRUST_ACTION_GENERIC_VERIFY_V2;
462+ WINTRUST_CATALOG_INFO wci;
463+ WINTRUST_DATA wd;
464+ bResult = FALSE;
465+ if(VerifyFileSignature(Catalog))
466+ {
467+ ZeroMemory(&wci, sizeof(WINTRUST_CATALOG_INFO));
468+ wci.cbStruct = sizeof(WINTRUST_CATALOG_INFO);
469+ wci.pcwszCatalogFilePath = Catalog;
470+ wci.pcwszMemberFilePath = Filename;
471+ if((wci.hMemberFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
472+ {
473+ p_CryptCATAdminCalcHashFromFileHandle(wci.hMemberFile, &wci.cbCalculatedFileHash, NULL, 0);
474+ if(wci.pbCalculatedFileHash = (BYTE*)malloc(wci.cbCalculatedFileHash))
475+ {
476+ if(p_CryptCATAdminCalcHashFromFileHandle(wci.hMemberFile, &wci.cbCalculatedFileHash, wci.pbCalculatedFileHash, 0))
477+ {
478+ ZeroMemory(&wd, sizeof(WINTRUST_DATA));
479+ wd.cbStruct = sizeof(WINTRUST_DATA);
480+ wd.dwUIChoice = WTD_UI_NONE;
481+ wd.dwUnionChoice = WTD_CHOICE_CATALOG;
482+ wd.pCatalog = &wci;
483+ if(WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &g, &wd) == ERROR_SUCCESS)
484+ bResult = TRUE;
485+ }
486+ free(wci.pbCalculatedFileHash);
487+ }
488+ CloseHandle(wci.hMemberFile);
489+ }
490+ }
491+ return bResult;
492+}
493+
494+BOOL WINAPI GetSHA1HashOfModule_Function(DIGEST_HANDLE refdata, PBYTE pData, DWORD dwLength)
495+{
496+ return CryptHashData(*(HCRYPTHASH*)refdata, pData, dwLength, 0);
497+}
498+
499+// モジュールのSHA1ハッシュを取得
500+// マニフェストファイルのfile要素のhash属性は実行可能ファイルの場合にImageGetDigestStreamで算出される
501+BOOL GetSHA1HashOfModule(LPCWSTR Filename, void* pHash)
502+{
503+ BOOL bResult;
504+ HCRYPTPROV hProv;
505+ HCRYPTHASH hHash;
506+ HANDLE hFile;
507+ DWORD dw;
508+ bResult = FALSE;
509+ if(CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, 0) || CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
510+ {
511+ if(CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
512+ {
513+ if((hFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
514+ {
515+ if(ImageGetDigestStream(hFile, CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO, GetSHA1HashOfModule_Function, (DIGEST_HANDLE)&hHash))
516+ {
517+ dw = 20;
518+ if(CryptGetHashParam(hHash, HP_HASHVAL, (BYTE*)pHash, &dw, 0))
519+ bResult = TRUE;
520+ }
521+ CloseHandle(hFile);
522+ }
523+ CryptDestroyHash(hHash);
524+ }
525+ CryptReleaseContext(hProv, 0);
526+ }
527+ return bResult;
528+}
529+
530+BOOL IsSxsModuleTrusted_Function(LPCWSTR Catalog, LPCWSTR Manifest, LPCWSTR Module)
531+{
532+ BOOL bResult;
533+ HANDLE hLock0;
534+ HANDLE hLock1;
535+ BYTE Hash[20];
536+ int i;
537+ static char HexTable[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
538+ char HashHex[41];
539+ HANDLE hFile;
540+ DWORD Size;
541+ char* pData;
542+ DWORD dw;
543+ bResult = FALSE;
544+ if(hLock0 = LockExistingFile(Catalog))
545+ {
546+ if(hLock1 = LockExistingFile(Manifest))
547+ {
548+ if(VerifyFileSignatureInCatalog(Catalog, Manifest))
549+ {
550+ if(GetSHA1HashOfModule(Module, &Hash))
551+ {
552+ for(i = 0; i < 20; i++)
553+ {
554+ HashHex[i * 2] = HexTable[(Hash[i] >> 4) & 0x0f];
555+ HashHex[i * 2 + 1] = HexTable[Hash[i] & 0x0f];
556+ }
557+ HashHex[i * 2] = '\0';
558+ if((hFile = CreateFileW(Manifest, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) != INVALID_HANDLE_VALUE)
559+ {
560+ Size = GetFileSize(hFile, NULL);
561+ if(pData = (char*)VirtualAlloc(NULL, Size + 1, MEM_COMMIT, PAGE_READWRITE))
562+ {
563+ VirtualLock(pData, Size + 1);
564+ if(ReadFile(hFile, pData, Size, &dw, NULL))
565+ {
566+ pData[dw] = '\0';
567+ if(strstr(pData, HashHex))
568+ bResult = TRUE;
569+ }
570+ VirtualUnlock(pData, Size + 1);
571+ VirtualFree(pData, Size + 1, MEM_DECOMMIT);
572+ }
573+ CloseHandle(hFile);
574+ }
575+ }
576+ }
577+ CloseHandle(hLock1);
578+ }
579+ CloseHandle(hLock0);
580+ }
581+ return bResult;
582+}
583+
584+// サイドバイサイドDLLを確認
585+// パスは"%SystemRoot%\WinSxS"以下を想定
586+// 以下のファイルが存在するものとする
587+// "\xxx\yyy.dll"、"\manifests\xxx.cat"、"\manifests\xxx.manifest"のセット(XPの全てのDLL、Vista以降の一部のDLL)
588+// "\xxx\yyy.dll"、"\catalogs\zzz.cat"、"\manifests\xxx.manifest"のセット(Vista以降のほとんどのDLL)
589+// 署名されたカタログファイルを用いてマニフェストファイルが改竄されていないことを確認
590+// ハッシュ値は マニフェストファイルのfile要素のhash属性に記述されているものを用いる
591+// マニフェストファイル内にSHA1ハッシュ値の16進数表記を直接検索しているが確率的に問題なし
592+BOOL IsSxsModuleTrusted(LPCWSTR Filename)
593+{
594+ BOOL bResult;
595+ wchar_t* pw0;
596+ wchar_t* pw1;
597+ wchar_t* pw2;
598+ wchar_t* pw3;
599+ wchar_t* pw4;
600+ wchar_t* pw5;
601+ wchar_t* p;
602+ HANDLE hFind;
603+ WIN32_FIND_DATAW wfd;
604+ bResult = FALSE;
605+ if(pw0 = AllocateStringW(wcslen(Filename) + 1))
606+ {
607+ wcscpy(pw0, Filename);
608+ if(p = wcsrchr(pw0, L'\\'))
609+ {
610+ wcscpy(p, L"");
611+ if(p = wcsrchr(pw0, L'\\'))
612+ {
613+ p++;
614+ if(pw1 = AllocateStringW(wcslen(p) + 1))
615+ {
616+ wcscpy(pw1, p);
617+ wcscpy(p, L"");
618+ if(pw2 = AllocateStringW(wcslen(pw0) + wcslen(L"manifests\\") + wcslen(pw1) + wcslen(L".cat") + 1))
619+ {
620+ wcscpy(pw2, pw0);
621+ wcscat(pw2, L"manifests\\");
622+ wcscat(pw2, pw1);
623+ if(pw3 = AllocateStringW(wcslen(pw2) + wcslen(L".manifest") + 1))
624+ {
625+ wcscpy(pw3, pw2);
626+ wcscat(pw3, L".manifest");
627+ wcscat(pw2, L".cat");
628+ if(IsSxsModuleTrusted_Function(pw2, pw3, Filename))
629+ bResult = TRUE;
630+ FreeDuplicatedString(pw3);
631+ }
632+ FreeDuplicatedString(pw2);
633+ }
634+ if(!bResult)
635+ {
636+ if(pw2 = AllocateStringW(wcslen(pw0) + wcslen(L"catalogs\\") + 1))
637+ {
638+ if(pw3 = AllocateStringW(wcslen(pw0) + wcslen(L"manifests\\") + wcslen(pw1) + wcslen(L".manifest") + 1))
639+ {
640+ wcscpy(pw2, pw0);
641+ wcscat(pw2, L"catalogs\\");
642+ wcscpy(pw3, pw0);
643+ wcscat(pw3, L"manifests\\");
644+ wcscat(pw3, pw1);
645+ wcscat(pw3, L".manifest");
646+ if(pw4 = AllocateStringW(wcslen(pw2) + wcslen(L"*.cat") + 1))
647+ {
648+ wcscpy(pw4, pw2);
649+ wcscat(pw4, L"*.cat");
650+ if((hFind = FindFirstFileW(pw4, &wfd)) != INVALID_HANDLE_VALUE)
651+ {
652+ do
653+ {
654+ if(pw5 = AllocateStringW(wcslen(pw2) + wcslen(wfd.cFileName) + 1))
655+ {
656+ wcscpy(pw5, pw2);
657+ wcscat(pw5, wfd.cFileName);
658+ if(IsSxsModuleTrusted_Function(pw5, pw3, Filename))
659+ bResult = TRUE;
660+ FreeDuplicatedString(pw5);
661+ }
662+ }
663+ while(!bResult && FindNextFileW(hFind, &wfd));
664+ FindClose(hFind);
665+ }
666+ FreeDuplicatedString(pw4);
667+ }
668+ FreeDuplicatedString(pw3);
669+ }
670+ FreeDuplicatedString(pw2);
671+ }
672+ }
673+ FreeDuplicatedString(pw1);
674+ }
675+ }
676+ }
677+ FreeDuplicatedString(pw0);
678+ }
679+ return bResult;
680+}
681+
682+// DLLを確認
683+BOOL IsModuleTrusted(LPCWSTR Filename)
684+{
685+ BOOL bResult;
686+ BYTE Hash[20];
687+ bResult = FALSE;
688+ if(LockThreadLock())
689+ {
690+ if(GetSHA1HashOfFile(Filename, &Hash))
691+ {
692+ if(FindTrustedModuleSHA1Hash(&Hash))
693+ bResult = TRUE;
694+ }
695+ if(!bResult)
696+ {
697+ if((g_ProcessProtectionLevel & PROCESS_PROTECTION_BUILTIN) && VerifyFileSignature(Filename))
698+ bResult = TRUE;
699+ }
700+ if(!bResult)
701+ {
702+ if((g_ProcessProtectionLevel & PROCESS_PROTECTION_SIDE_BY_SIDE) && IsSxsModuleTrusted(Filename))
703+ bResult = TRUE;
704+ }
705+ if(!bResult)
706+ {
707+ if((g_ProcessProtectionLevel & PROCESS_PROTECTION_SYSTEM_FILE) && SfcIsFileProtected(NULL, Filename))
708+ bResult = TRUE;
709+ }
710+ UnlockThreadLock();
711+ }
712+ return bResult;
713+}
714+
715+// kernel32.dllのLoadLibraryExW相当の関数
716+// ドキュメントが無いため詳細は不明
717+// 一部のウィルス対策ソフト(Avast!等)がLdrLoadDllをフックしているためLdrLoadDllを書き換えるべきではない
718+// カーネルモードのコードに対しては効果なし
719+// SeDebugPrivilegeが使用可能なユーザーに対しては効果なし
720+HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
721+{
722+ HMODULE r = NULL;
723+ UNICODE_STRING us;
724+ HANDLE hDataFile;
725+ HANDLE hMapping;
726+ DWORD DllFlags;
727+ us.Length = sizeof(wchar_t) * wcslen(lpLibFileName);
728+ us.MaximumLength = sizeof(wchar_t) * (wcslen(lpLibFileName) + 1);
729+ us.Buffer = (PWSTR)lpLibFileName;
730+// if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE))
731+ if(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | 0x00000040))
732+ {
733+// if(p_LdrGetDllHandle(NULL, NULL, &us, &r) == STATUS_SUCCESS)
734+ if(p_LdrGetDllHandle(NULL, NULL, &us, &r) == 0)
735+ {
736+// dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE);
737+ dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | 0x00000040);
738+ dwFlags |= DONT_RESOLVE_DLL_REFERENCES;
739+ }
740+ else
741+ {
742+// if(dwFlags & LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)
743+ if(dwFlags & 0x00000040)
744+ hDataFile = CreateFileW(lpLibFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
745+ else
746+ hDataFile = CreateFileW(lpLibFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
747+ if(hDataFile != INVALID_HANDLE_VALUE)
748+ {
749+ if(hMapping = CreateFileMappingW(hDataFile, NULL, PAGE_READONLY, 0, 0, NULL))
750+ {
751+ if(r = (HMODULE)MapViewOfFileEx(hMapping, FILE_MAP_READ, 0, 0, 0, NULL))
752+ {
753+ if(p_RtlImageNtHeader(r))
754+ r = (HMODULE)((size_t)r | 1);
755+ else
756+ {
757+ UnmapViewOfFile(r);
758+ r = NULL;
759+ }
760+ }
761+ CloseHandle(hMapping);
762+ }
763+ CloseHandle(hDataFile);
764+ }
765+ else
766+ {
767+// dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE);
768+ dwFlags &= ~(LOAD_LIBRARY_AS_DATAFILE | 0x00000040);
769+ dwFlags |= DONT_RESOLVE_DLL_REFERENCES;
770+ }
771+ }
772+ }
773+// if(!(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE)))
774+ if(!(dwFlags & (LOAD_LIBRARY_AS_DATAFILE | 0x00000040)))
775+ {
776+ DllFlags = 0;
777+// if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_IMAGE_RESOURCE))
778+ if(dwFlags & (DONT_RESOLVE_DLL_REFERENCES | 0x00000020))
779+ DllFlags |= 0x00000002;
780+// if(p_LdrLoadDll(NULL, &DllFlags, &us, &r) == STATUS_SUCCESS)
781+ if(p_LdrLoadDll(NULL, &DllFlags, &us, &r) == 0)
782+ {
783+ }
784+ else
785+ r = NULL;
786+ }
787+ return r;
788+}
789+
790+void SetProcessProtectionLevel(DWORD Level)
791+{
792+ g_ProcessProtectionLevel = Level;
793+}
794+
795+// ファイルのSHA1ハッシュを取得
796+BOOL GetSHA1HashOfFile(LPCWSTR Filename, void* pHash)
797+{
798+ BOOL bResult;
799+ HCRYPTPROV hProv;
800+ HCRYPTHASH hHash;
801+ HANDLE hFile;
802+ DWORD Size;
803+ void* pData;
804+ DWORD dw;
805+ bResult = FALSE;
806+ if(CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, 0) || CryptAcquireContextW(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
807+ {
808+ if(CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash))
809+ {
810+ if((hFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
811+ {
812+ Size = GetFileSize(hFile, NULL);
813+ if(pData = VirtualAlloc(NULL, Size, MEM_COMMIT, PAGE_READWRITE))
814+ {
815+ VirtualLock(pData, Size);
816+ if(ReadFile(hFile, pData, Size, &dw, NULL))
817+ {
818+ if(CryptHashData(hHash, (BYTE*)pData, Size, 0))
819+ {
820+ dw = 20;
821+ if(CryptGetHashParam(hHash, HP_HASHVAL, (BYTE*)pHash, &dw, 0))
822+ bResult = TRUE;
823+ }
824+ }
825+ VirtualUnlock(pData, Size);
826+ VirtualFree(pData, Size, MEM_DECOMMIT);
827+ }
828+ CloseHandle(hFile);
829+ }
830+ CryptDestroyHash(hHash);
831+ }
832+ CryptReleaseContext(hProv, 0);
833+ }
834+ return bResult;
835+}
836+
837+// DLLのハッシュを登録
838+BOOL RegisterTrustedModuleSHA1Hash(void* pHash)
839+{
840+ BOOL bResult;
841+ BYTE NullHash[20] = {0};
842+ int i;
843+ bResult = FALSE;
844+ if(FindTrustedModuleSHA1Hash(pHash))
845+ bResult = TRUE;
846+ else
847+ {
848+ i = 0;
849+ while(i < MAX_TRUSTED_MD5_HASH_TABLE)
850+ {
851+ if(memcmp(&g_TrustedMD5HashTable[i], &NullHash, 20) == 0)
852+ {
853+ memcpy(&g_TrustedMD5HashTable[i], pHash, 20);
854+ bResult = TRUE;
855+ break;
856+ }
857+ i++;
858+ }
859+ }
860+ return bResult;
861+}
862+
863+// DLLのハッシュの登録を解除
864+BOOL UnregisterTrustedModuleSHA1Hash(void* pHash)
865+{
866+ BOOL bResult;
867+ BYTE NullHash[20] = {0};
868+ int i;
869+ bResult = FALSE;
870+ i = 0;
871+ while(i < MAX_TRUSTED_MD5_HASH_TABLE)
872+ {
873+ if(memcmp(&g_TrustedMD5HashTable[i], pHash, 20) == 0)
874+ {
875+ memcpy(&g_TrustedMD5HashTable[i], &NullHash, 20);
876+ bResult = TRUE;
877+ break;
878+ }
879+ i++;
880+ }
881+ return bResult;
882+}
883+
884+// 信頼できないDLLをアンロード
885+BOOL UnloadUntrustedModule()
886+{
887+ BOOL bResult;
888+ wchar_t* pw0;
889+ HANDLE hSnapshot;
890+ MODULEENTRY32 me;
891+ DWORD Length;
892+ bResult = FALSE;
893+ pw0 = NULL;
894+ if((hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId())) != INVALID_HANDLE_VALUE)
895+ {
896+ bResult = TRUE;
897+ me.dwSize = sizeof(MODULEENTRY32);
898+ if(Module32First(hSnapshot, &me))
899+ {
900+ do
901+ {
902+ Length = MAX_PATH;
903+ FreeDuplicatedString(pw0);
904+ if(pw0 = AllocateStringW(Length))
905+ {
906+ if(GetModuleFileNameW(me.hModule, pw0, Length) > 0)
907+ {
908+ while(pw0)
909+ {
910+ if(GetModuleFileNameW(me.hModule, pw0, Length) + 1 <= Length)
911+ break;
912+ Length = Length * 2;
913+ FreeDuplicatedString(pw0);
914+ pw0 = AllocateStringW(Length);
915+ }
916+ }
917+ }
918+ if(pw0)
919+ {
920+ if(!IsModuleTrusted(pw0))
921+ {
922+ if(me.hModule != GetModuleHandleW(NULL))
923+ {
924+ while(FreeLibrary(me.hModule))
925+ {
926+ }
927+ if(GetModuleFileNameW(me.hModule, pw0, Length) > 0)
928+ {
929+ bResult = FALSE;
930+ break;
931+ }
932+ }
933+ }
934+ }
935+ else
936+ {
937+ bResult = FALSE;
938+ break;
939+ }
940+ }
941+ while(Module32Next(hSnapshot, &me));
942+ }
943+ CloseHandle(hSnapshot);
944+ }
945+ FreeDuplicatedString(pw0);
946+ return bResult;
947+}
948+
949+// 関数ポインタを使用可能な状態に初期化
950+BOOL InitializeLoadLibraryHook()
951+{
952+ BOOL bResult;
953+ HMODULE hModule;
954+ bResult = TRUE;
955+ if(!(hModule = GetModuleHandleW(L"kernel32.dll")))
956+ bResult = FALSE;
957+ if(!(GET_FUNCTION(hModule, LoadLibraryA)))
958+ bResult = FALSE;
959+ if(!(GET_FUNCTION(hModule, LoadLibraryW)))
960+ bResult = FALSE;
961+ if(!(GET_FUNCTION(hModule, LoadLibraryExA)))
962+ bResult = FALSE;
963+ if(!(GET_FUNCTION(hModule, LoadLibraryExW)))
964+ bResult = FALSE;
965+ if(!(hModule = GetModuleHandleW(L"ntdll.dll")))
966+ bResult = FALSE;
967+ if(!(GET_FUNCTION(hModule, LdrLoadDll)))
968+ bResult = FALSE;
969+ if(!(GET_FUNCTION(hModule, LdrGetDllHandle)))
970+ bResult = FALSE;
971+ if(!(GET_FUNCTION(hModule, RtlImageNtHeader)))
972+ bResult = FALSE;
973+ if(!(hModule = LoadLibraryW(L"wintrust.dll")))
974+ bResult = FALSE;
975+ if(!(GET_FUNCTION(hModule, CryptCATAdminCalcHashFromFileHandle)))
976+ bResult = FALSE;
977+ return bResult;
978+}
979+
980+// SetWindowsHookEx対策
981+// DLL Injectionされた場合は上のh_LoadLibrary系関数でトラップ可能
982+BOOL EnableLoadLibraryHook(BOOL bEnable)
983+{
984+ BOOL bResult;
985+ bResult = FALSE;
986+ if(bEnable)
987+ {
988+ bResult = TRUE;
989+#ifdef USE_CODE_HOOK
990+ if(!SET_HOOK_FUNCTION(LoadLibraryA))
991+ bResult = FALSE;
992+ if(!SET_HOOK_FUNCTION(LoadLibraryW))
993+ bResult = FALSE;
994+ if(!SET_HOOK_FUNCTION(LoadLibraryExA))
995+ bResult = FALSE;
996+ if(!SET_HOOK_FUNCTION(LoadLibraryExW))
997+ bResult = FALSE;
998+#endif
999+#ifdef USE_IAT_HOOK
1000+ if(!HookFunctionInIAT(p_LoadLibraryA, h_LoadLibraryA))
1001+ bResult = FALSE;
1002+ if(!HookFunctionInIAT(p_LoadLibraryW, h_LoadLibraryW))
1003+ bResult = FALSE;
1004+ if(!HookFunctionInIAT(p_LoadLibraryExA, h_LoadLibraryExA))
1005+ bResult = FALSE;
1006+ if(!HookFunctionInIAT(p_LoadLibraryExW, h_LoadLibraryExW))
1007+ bResult = FALSE;
1008+#endif
1009+ }
1010+ else
1011+ {
1012+ bResult = TRUE;
1013+#ifdef USE_CODE_HOOK
1014+ if(!END_HOOK_FUNCTION(LoadLibraryA))
1015+ bResult = FALSE;
1016+ if(!END_HOOK_FUNCTION(LoadLibraryW))
1017+ bResult = FALSE;
1018+ if(!END_HOOK_FUNCTION(LoadLibraryExA))
1019+ bResult = FALSE;
1020+ if(!END_HOOK_FUNCTION(LoadLibraryExW))
1021+ bResult = FALSE;
1022+#endif
1023+#ifdef USE_IAT_HOOK
1024+ if(!HookFunctionInIAT(h_LoadLibraryA, p_LoadLibraryA))
1025+ bResult = FALSE;
1026+ if(!HookFunctionInIAT(h_LoadLibraryW, p_LoadLibraryW))
1027+ bResult = FALSE;
1028+ if(!HookFunctionInIAT(h_LoadLibraryExA, p_LoadLibraryExA))
1029+ bResult = FALSE;
1030+ if(!HookFunctionInIAT(h_LoadLibraryExW, p_LoadLibraryExW))
1031+ bResult = FALSE;
1032+#endif
1033+ }
1034+ return bResult;
1035+}
1036+
1037+// ReadProcessMemory、WriteProcessMemory、CreateRemoteThread対策
1038+// TerminateProcessのみ許可
1039+BOOL RestartProtectedProcess(LPCTSTR Keyword)
1040+{
1041+ BOOL bResult;
1042+ ACL* pACL;
1043+ SID_IDENTIFIER_AUTHORITY sia = SECURITY_WORLD_SID_AUTHORITY;
1044+ PSID pSID;
1045+ SECURITY_DESCRIPTOR sd;
1046+ TCHAR* CommandLine;
1047+ SECURITY_ATTRIBUTES sa;
1048+ STARTUPINFO si;
1049+ PROCESS_INFORMATION pi;
1050+ bResult = FALSE;
1051+ if(_tcslen(GetCommandLine()) >= _tcslen(Keyword) && _tcscmp(GetCommandLine() + _tcslen(GetCommandLine()) - _tcslen(Keyword), Keyword) == 0)
1052+ return FALSE;
1053+ if(pACL = (ACL*)malloc(sizeof(ACL) + 1024))
1054+ {
1055+ if(InitializeAcl(pACL, sizeof(ACL) + 1024, ACL_REVISION))
1056+ {
1057+ if(AllocateAndInitializeSid(&sia, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pSID))
1058+ {
1059+ if(AddAccessAllowedAce(pACL, ACL_REVISION, PROCESS_TERMINATE, pSID))
1060+ {
1061+ if(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
1062+ {
1063+ if(SetSecurityDescriptorDacl(&sd, TRUE, pACL, FALSE))
1064+ {
1065+ if(CommandLine = (TCHAR*)malloc(sizeof(TCHAR) * (_tcslen(GetCommandLine()) + _tcslen(Keyword) + 1)))
1066+ {
1067+ _tcscpy(CommandLine, GetCommandLine());
1068+ _tcscat(CommandLine, Keyword);
1069+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
1070+ sa.lpSecurityDescriptor = &sd;
1071+ sa.bInheritHandle = FALSE;
1072+ GetStartupInfo(&si);
1073+ if(CreateProcess(NULL, CommandLine, &sa, NULL, FALSE, 0, NULL, NULL, &si, &pi))
1074+ {
1075+ CloseHandle(pi.hThread);
1076+ CloseHandle(pi.hProcess);
1077+ bResult = TRUE;
1078+ }
1079+ free(CommandLine);
1080+ }
1081+ }
1082+ }
1083+ }
1084+ FreeSid(pSID);
1085+ }
1086+ }
1087+ free(pACL);
1088+ }
1089+ return bResult;
1090+}
1091+
--- a/protectprocess.h
+++ b/protectprocess.h
@@ -1,77 +1,77 @@
1-// protectprocess.h
2-// Copyright (C) 2011 Suguru Kawamoto
3-// プロセスの保護
4-
5-#ifndef __PROTECTPROCESS_H__
6-#define __PROTECTPROCESS_H__
7-
8-#define ENABLE_PROCESS_PROTECTION
9-
10-// 次の中から1個のみ有効にする
11-// フック先の関数のコードを書き換える
12-// 全ての呼び出しをフック可能だが原理的に二重呼び出しに対応できない
13-#define USE_CODE_HOOK
14-// フック先の関数のインポートアドレステーブルを書き換える
15-// 二重呼び出しが可能だが呼び出し方法によってはフックを回避される
16-//#define USE_IAT_HOOK
17-
18-typedef HMODULE (WINAPI* _LoadLibraryA)(LPCSTR);
19-typedef HMODULE (WINAPI* _LoadLibraryW)(LPCWSTR);
20-typedef HMODULE (WINAPI* _LoadLibraryExA)(LPCSTR, HANDLE, DWORD);
21-typedef HMODULE (WINAPI* _LoadLibraryExW)(LPCWSTR, HANDLE, DWORD);
22-
23-#ifndef DO_NOT_REPLACE
24-
25-#ifdef USE_IAT_HOOK
26-
27-// 変数の宣言
28-#define EXTERN_HOOK_FUNCTION_VAR(name) extern _##name p_##name;
29-
30-#undef LoadLibraryA
31-#define LoadLibraryA p_LoadLibraryA
32-EXTERN_HOOK_FUNCTION_VAR(LoadLibraryA)
33-#undef LoadLibraryW
34-#define LoadLibraryW p_LoadLibraryW
35-EXTERN_HOOK_FUNCTION_VAR(LoadLibraryW)
36-#undef LoadLibraryExA
37-#define LoadLibraryExA p_LoadLibraryExA
38-EXTERN_HOOK_FUNCTION_VAR(LoadLibraryExA)
39-#undef LoadLibraryExW
40-#define LoadLibraryExW p_LoadLibraryExW
41-EXTERN_HOOK_FUNCTION_VAR(LoadLibraryExW)
42-
43-#endif
44-
45-#endif
46-
47-// ロード済みのモジュールは検査をパス
48-#define PROCESS_PROTECTION_LOADED 0x00000001
49-// モジュールに埋め込まれたAuthenticode署名を検査
50-#define PROCESS_PROTECTION_BUILTIN 0x00000002
51-// サイドバイサイドのAuthenticode署名を検査
52-#define PROCESS_PROTECTION_SIDE_BY_SIDE 0x00000004
53-// WFPによる保護下にあるかを検査
54-#define PROCESS_PROTECTION_SYSTEM_FILE 0x00000008
55-// Authenticode署名の有効期限を無視
56-#define PROCESS_PROTECTION_EXPIRED 0x00000010
57-// Authenticode署名の発行元を無視
58-#define PROCESS_PROTECTION_UNAUTHORIZED 0x00000020
59-
60-#define PROCESS_PROTECTION_NONE 0
61-#define PROCESS_PROTECTION_DEFAULT PROCESS_PROTECTION_HIGH
62-#define PROCESS_PROTECTION_HIGH (PROCESS_PROTECTION_BUILTIN | PROCESS_PROTECTION_SIDE_BY_SIDE | PROCESS_PROTECTION_SYSTEM_FILE)
63-#define PROCESS_PROTECTION_MEDIUM (PROCESS_PROTECTION_HIGH | PROCESS_PROTECTION_LOADED | PROCESS_PROTECTION_EXPIRED)
64-#define PROCESS_PROTECTION_LOW (PROCESS_PROTECTION_MEDIUM | PROCESS_PROTECTION_UNAUTHORIZED)
65-
66-HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
67-void SetProcessProtectionLevel(DWORD Level);
68-BOOL GetSHA1HashOfFile(LPCWSTR Filename, void* pHash);
69-BOOL RegisterTrustedModuleSHA1Hash(void* pHash);
70-BOOL UnregisterTrustedModuleSHA1Hash(void* pHash);
71-BOOL UnloadUntrustedModule();
72-BOOL InitializeLoadLibraryHook();
73-BOOL EnableLoadLibraryHook(BOOL bEnable);
74-BOOL RestartProtectedProcess(LPCTSTR Keyword);
75-
76-#endif
77-
1+// protectprocess.h
2+// Copyright (C) 2011 Suguru Kawamoto
3+// プロセスの保護
4+
5+#ifndef __PROTECTPROCESS_H__
6+#define __PROTECTPROCESS_H__
7+
8+#define ENABLE_PROCESS_PROTECTION
9+
10+// 次の中から1個のみ有効にする
11+// フック先の関数のコードを書き換える
12+// 全ての呼び出しをフック可能だが原理的に二重呼び出しに対応できない
13+#define USE_CODE_HOOK
14+// フック先の関数のインポートアドレステーブルを書き換える
15+// 二重呼び出しが可能だが呼び出し方法によってはフックを回避される
16+//#define USE_IAT_HOOK
17+
18+typedef HMODULE (WINAPI* _LoadLibraryA)(LPCSTR);
19+typedef HMODULE (WINAPI* _LoadLibraryW)(LPCWSTR);
20+typedef HMODULE (WINAPI* _LoadLibraryExA)(LPCSTR, HANDLE, DWORD);
21+typedef HMODULE (WINAPI* _LoadLibraryExW)(LPCWSTR, HANDLE, DWORD);
22+
23+#ifndef DO_NOT_REPLACE
24+
25+#ifdef USE_IAT_HOOK
26+
27+// 変数の宣言
28+#define EXTERN_HOOK_FUNCTION_VAR(name) extern _##name p_##name;
29+
30+#undef LoadLibraryA
31+#define LoadLibraryA p_LoadLibraryA
32+EXTERN_HOOK_FUNCTION_VAR(LoadLibraryA)
33+#undef LoadLibraryW
34+#define LoadLibraryW p_LoadLibraryW
35+EXTERN_HOOK_FUNCTION_VAR(LoadLibraryW)
36+#undef LoadLibraryExA
37+#define LoadLibraryExA p_LoadLibraryExA
38+EXTERN_HOOK_FUNCTION_VAR(LoadLibraryExA)
39+#undef LoadLibraryExW
40+#define LoadLibraryExW p_LoadLibraryExW
41+EXTERN_HOOK_FUNCTION_VAR(LoadLibraryExW)
42+
43+#endif
44+
45+#endif
46+
47+// ロード済みのモジュールは検査をパス
48+#define PROCESS_PROTECTION_LOADED 0x00000001
49+// モジュールに埋め込まれたAuthenticode署名を検査
50+#define PROCESS_PROTECTION_BUILTIN 0x00000002
51+// サイドバイサイドのAuthenticode署名を検査
52+#define PROCESS_PROTECTION_SIDE_BY_SIDE 0x00000004
53+// WFPによる保護下にあるかを検査
54+#define PROCESS_PROTECTION_SYSTEM_FILE 0x00000008
55+// Authenticode署名の有効期限を無視
56+#define PROCESS_PROTECTION_EXPIRED 0x00000010
57+// Authenticode署名の発行元を無視
58+#define PROCESS_PROTECTION_UNAUTHORIZED 0x00000020
59+
60+#define PROCESS_PROTECTION_NONE 0
61+#define PROCESS_PROTECTION_DEFAULT PROCESS_PROTECTION_HIGH
62+#define PROCESS_PROTECTION_HIGH (PROCESS_PROTECTION_BUILTIN | PROCESS_PROTECTION_SIDE_BY_SIDE | PROCESS_PROTECTION_SYSTEM_FILE)
63+#define PROCESS_PROTECTION_MEDIUM (PROCESS_PROTECTION_HIGH | PROCESS_PROTECTION_LOADED | PROCESS_PROTECTION_EXPIRED)
64+#define PROCESS_PROTECTION_LOW (PROCESS_PROTECTION_MEDIUM | PROCESS_PROTECTION_UNAUTHORIZED)
65+
66+HMODULE System_LoadLibrary(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);
67+void SetProcessProtectionLevel(DWORD Level);
68+BOOL GetSHA1HashOfFile(LPCWSTR Filename, void* pHash);
69+BOOL RegisterTrustedModuleSHA1Hash(void* pHash);
70+BOOL UnregisterTrustedModuleSHA1Hash(void* pHash);
71+BOOL UnloadUntrustedModule();
72+BOOL InitializeLoadLibraryHook();
73+BOOL EnableLoadLibraryHook(BOOL bEnable);
74+BOOL RestartProtectedProcess(LPCTSTR Keyword);
75+
76+#endif
77+
--- a/socketwrapper.c
+++ b/socketwrapper.c
@@ -1,325 +1,325 @@
1-// socketwrapper.c
2-// Copyright (C) 2011 Suguru Kawamoto
3-// ソケットラッパー
4-// socket関連関数をOpenSSL用に置換
5-// コンパイルにはOpenSSLのヘッダーファイルが必要
6-// 実行にはOpenSSLのDLLが必要
7-
8-#include <windows.h>
9-#include <mmsystem.h>
10-#include <openssl/ssl.h>
11-
12-#include "socketwrapper.h"
13-#include "protectprocess.h"
14-
15-typedef void (__cdecl* _SSL_load_error_strings)();
16-typedef int (__cdecl* _SSL_library_init)();
17-typedef SSL_METHOD* (__cdecl* _SSLv23_method)();
18-typedef SSL_CTX* (__cdecl* _SSL_CTX_new)(SSL_METHOD*);
19-typedef void (__cdecl* _SSL_CTX_free)(SSL_CTX*);
20-typedef SSL* (__cdecl* _SSL_new)(SSL_CTX*);
21-typedef void (__cdecl* _SSL_free)(SSL*);
22-typedef int (__cdecl* _SSL_shutdown)(SSL*);
23-typedef int (__cdecl* _SSL_get_fd)(SSL*);
24-typedef int (__cdecl* _SSL_set_fd)(SSL*, int);
25-typedef int (__cdecl* _SSL_accept)(SSL*);
26-typedef int (__cdecl* _SSL_connect)(SSL*);
27-typedef int (__cdecl* _SSL_write)(SSL*, const void*, int);
28-typedef int (__cdecl* _SSL_peek)(SSL*, void*, int);
29-typedef int (__cdecl* _SSL_read)(SSL*, void*, int);
30-typedef int (__cdecl* _SSL_get_error)(SSL*, int);
31-
32-_SSL_load_error_strings pSSL_load_error_strings;
33-_SSL_library_init pSSL_library_init;
34-_SSLv23_method pSSLv23_method;
35-_SSL_CTX_new pSSL_CTX_new;
36-_SSL_CTX_free pSSL_CTX_free;
37-_SSL_new pSSL_new;
38-_SSL_free pSSL_free;
39-_SSL_shutdown pSSL_shutdown;
40-_SSL_get_fd pSSL_get_fd;
41-_SSL_set_fd pSSL_set_fd;
42-_SSL_accept pSSL_accept;
43-_SSL_connect pSSL_connect;
44-_SSL_write pSSL_write;
45-_SSL_peek pSSL_peek;
46-_SSL_read pSSL_read;
47-_SSL_get_error pSSL_get_error;
48-
49-#define MAX_SSL_SOCKET 64
50-
51-BOOL g_bOpenSSLLoaded;
52-HMODULE g_hOpenSSL;
53-CRITICAL_SECTION g_OpenSSLLock;
54-DWORD g_OpenSSLTimeout;
55-LPSSLTIMEOUTCALLBACK g_pOpenSSLTimeoutCallback;
56-SSL_CTX* g_pOpenSSLCTX;
57-SSL* g_pOpenSSLHandle[MAX_SSL_SOCKET];
58-
59-BOOL __stdcall DefaultSSLTimeoutCallback()
60-{
61- Sleep(100);
62- return FALSE;
63-}
64-
65-BOOL LoadOpenSSL()
66-{
67- if(g_bOpenSSLLoaded)
68- return FALSE;
69-#ifdef ENABLE_PROCESS_PROTECTION
70- // 同梱するOpenSSLのバージョンに合わせてSHA1ハッシュ値を変更すること
71- // ssleay32.dll 1.0.0e
72- // libssl32.dll 1.0.0e
73- RegisterTrustedModuleSHA1Hash("\x4E\xB7\xA0\x22\x14\x4B\x58\x6D\xBC\xF5\x21\x0D\x96\x78\x0D\x79\x7D\x66\xB2\xB0");
74- // libeay32.dll 1.0.0e
75- RegisterTrustedModuleSHA1Hash("\x01\x32\x7A\xAE\x69\x26\xE6\x58\xC7\x63\x22\x1E\x53\x5A\x78\xBC\x61\xC7\xB5\xC1");
76-#endif
77- g_hOpenSSL = LoadLibrary("ssleay32.dll");
78- if(!g_hOpenSSL)
79- g_hOpenSSL = LoadLibrary("libssl32.dll");
80- if(!g_hOpenSSL
81- || !(pSSL_load_error_strings = (_SSL_load_error_strings)GetProcAddress(g_hOpenSSL, "SSL_load_error_strings"))
82- || !(pSSL_library_init = (_SSL_library_init)GetProcAddress(g_hOpenSSL, "SSL_library_init"))
83- || !(pSSLv23_method = (_SSLv23_method)GetProcAddress(g_hOpenSSL, "SSLv23_method"))
84- || !(pSSL_CTX_new = (_SSL_CTX_new)GetProcAddress(g_hOpenSSL, "SSL_CTX_new"))
85- || !(pSSL_CTX_free = (_SSL_CTX_free)GetProcAddress(g_hOpenSSL, "SSL_CTX_free"))
86- || !(pSSL_new = (_SSL_new)GetProcAddress(g_hOpenSSL, "SSL_new"))
87- || !(pSSL_free = (_SSL_free)GetProcAddress(g_hOpenSSL, "SSL_free"))
88- || !(pSSL_shutdown = (_SSL_shutdown)GetProcAddress(g_hOpenSSL, "SSL_shutdown"))
89- || !(pSSL_get_fd = (_SSL_get_fd)GetProcAddress(g_hOpenSSL, "SSL_get_fd"))
90- || !(pSSL_set_fd = (_SSL_set_fd)GetProcAddress(g_hOpenSSL, "SSL_set_fd"))
91- || !(pSSL_accept = (_SSL_accept)GetProcAddress(g_hOpenSSL, "SSL_accept"))
92- || !(pSSL_connect = (_SSL_connect)GetProcAddress(g_hOpenSSL, "SSL_connect"))
93- || !(pSSL_write = (_SSL_write)GetProcAddress(g_hOpenSSL, "SSL_write"))
94- || !(pSSL_peek = (_SSL_peek)GetProcAddress(g_hOpenSSL, "SSL_peek"))
95- || !(pSSL_read = (_SSL_read)GetProcAddress(g_hOpenSSL, "SSL_read"))
96- || !(pSSL_get_error = (_SSL_get_error)GetProcAddress(g_hOpenSSL, "SSL_get_error")))
97- {
98- if(g_hOpenSSL)
99- FreeLibrary(g_hOpenSSL);
100- g_hOpenSSL = NULL;
101- return FALSE;
102- }
103- InitializeCriticalSection(&g_OpenSSLLock);
104- pSSL_load_error_strings();
105- pSSL_library_init();
106- SetSSLTimeoutCallback(60000, DefaultSSLTimeoutCallback);
107- g_bOpenSSLLoaded = TRUE;
108- return TRUE;
109-}
110-
111-void FreeOpenSSL()
112-{
113- int i;
114- if(!g_bOpenSSLLoaded)
115- return;
116- EnterCriticalSection(&g_OpenSSLLock);
117- for(i = 0; i < MAX_SSL_SOCKET; i++)
118- {
119- if(g_pOpenSSLHandle[i])
120- {
121- pSSL_shutdown(g_pOpenSSLHandle[i]);
122- pSSL_free(g_pOpenSSLHandle[i]);
123- g_pOpenSSLHandle[i] = NULL;
124- }
125- }
126- if(g_pOpenSSLCTX)
127- pSSL_CTX_free(g_pOpenSSLCTX);
128- g_pOpenSSLCTX = NULL;
129- FreeLibrary(g_hOpenSSL);
130- g_hOpenSSL = NULL;
131- LeaveCriticalSection(&g_OpenSSLLock);
132- DeleteCriticalSection(&g_OpenSSLLock);
133- g_bOpenSSLLoaded = FALSE;
134-}
135-
136-BOOL IsOpenSSLLoaded()
137-{
138- return g_bOpenSSLLoaded;
139-}
140-
141-SSL** GetUnusedSSLPointer()
142-{
143- int i;
144- for(i = 0; i < MAX_SSL_SOCKET; i++)
145- {
146- if(!g_pOpenSSLHandle[i])
147- return &g_pOpenSSLHandle[i];
148- }
149- return NULL;
150-}
151-
152-SSL** FindSSLPointerFromSocket(SOCKET s)
153-{
154- int i;
155- for(i = 0; i < MAX_SSL_SOCKET; i++)
156- {
157- if(g_pOpenSSLHandle[i])
158- {
159- if(pSSL_get_fd(g_pOpenSSLHandle[i]) == s)
160- return &g_pOpenSSLHandle[i];
161- }
162- }
163- return NULL;
164-}
165-
166-void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback)
167-{
168- if(!g_bOpenSSLLoaded)
169- return;
170- EnterCriticalSection(&g_OpenSSLLock);
171- g_OpenSSLTimeout = Timeout;
172- g_pOpenSSLTimeoutCallback = pCallback;
173- LeaveCriticalSection(&g_OpenSSLLock);
174-}
175-
176-BOOL AttachSSL(SOCKET s)
177-{
178- BOOL r;
179- DWORD Time;
180- SSL** ppSSL;
181- if(!g_bOpenSSLLoaded)
182- return FALSE;
183- r = FALSE;
184- Time = timeGetTime();
185- EnterCriticalSection(&g_OpenSSLLock);
186- if(!g_pOpenSSLCTX)
187- g_pOpenSSLCTX = pSSL_CTX_new(pSSLv23_method());
188- if(g_pOpenSSLCTX)
189- {
190- if(ppSSL = GetUnusedSSLPointer())
191- {
192- if(*ppSSL = pSSL_new(g_pOpenSSLCTX))
193- {
194- if(pSSL_set_fd(*ppSSL, s) != 0)
195- {
196- r = TRUE;
197- // SSLのネゴシエーションには時間がかかる場合がある
198- while(pSSL_connect(*ppSSL) != 1)
199- {
200- LeaveCriticalSection(&g_OpenSSLLock);
201- if(g_pOpenSSLTimeoutCallback() || timeGetTime() - Time >= g_OpenSSLTimeout)
202- {
203- DetachSSL(s);
204- r = FALSE;
205- EnterCriticalSection(&g_OpenSSLLock);
206- break;
207- }
208- EnterCriticalSection(&g_OpenSSLLock);
209- }
210- }
211- else
212- {
213- LeaveCriticalSection(&g_OpenSSLLock);
214- DetachSSL(s);
215- EnterCriticalSection(&g_OpenSSLLock);
216- }
217- }
218- }
219- }
220- LeaveCriticalSection(&g_OpenSSLLock);
221- return r;
222-}
223-
224-BOOL DetachSSL(SOCKET s)
225-{
226- BOOL r;
227- SSL** ppSSL;
228- if(!g_bOpenSSLLoaded)
229- return FALSE;
230- r = FALSE;
231- EnterCriticalSection(&g_OpenSSLLock);
232- if(ppSSL = FindSSLPointerFromSocket(s))
233- {
234- pSSL_shutdown(*ppSSL);
235- pSSL_free(*ppSSL);
236- *ppSSL = NULL;
237- r = TRUE;
238- }
239- LeaveCriticalSection(&g_OpenSSLLock);
240- return r;
241-}
242-
243-BOOL IsSSLAttached(SOCKET s)
244-{
245- SSL** ppSSL;
246- if(!g_bOpenSSLLoaded)
247- return FALSE;
248- EnterCriticalSection(&g_OpenSSLLock);
249- ppSSL = FindSSLPointerFromSocket(s);
250- LeaveCriticalSection(&g_OpenSSLLock);
251- if(!ppSSL)
252- return TRUE;
253- return TRUE;
254-}
255-
256-SOCKET socketS(int af, int type, int protocol)
257-{
258- return socket(af, type, protocol);
259-}
260-
261-int bindS(SOCKET s, const struct sockaddr *addr, int namelen)
262-{
263- return bind(s, addr, namelen);
264-}
265-
266-int listenS(SOCKET s, int backlog)
267-{
268- return listen(s, backlog);
269-}
270-
271-SOCKET acceptS(SOCKET s, struct sockaddr *addr, int *addrlen)
272-{
273- SOCKET r;
274- r = accept(s, addr, addrlen);
275- if(!AttachSSL(r))
276- {
277- closesocket(r);
278- return INVALID_SOCKET;
279- }
280- return r;
281-}
282-
283-int connectS(SOCKET s, const struct sockaddr *name, int namelen)
284-{
285- int r;
286- r = connect(s, name, namelen);
287- if(!AttachSSL(r))
288- return SOCKET_ERROR;
289- return r;
290-}
291-
292-int closesocketS(SOCKET s)
293-{
294- DetachSSL(s);
295- return closesocket(s);
296-}
297-
298-int sendS(SOCKET s, const char * buf, int len, int flags)
299-{
300- SSL** ppSSL;
301- if(!g_bOpenSSLLoaded)
302- return send(s, buf, len, flags);
303- EnterCriticalSection(&g_OpenSSLLock);
304- ppSSL = FindSSLPointerFromSocket(s);
305- LeaveCriticalSection(&g_OpenSSLLock);
306- if(!ppSSL)
307- return send(s, buf, len, flags);
308- return pSSL_write(*ppSSL, buf, len);
309-}
310-
311-int recvS(SOCKET s, char * buf, int len, int flags)
312-{
313- SSL** ppSSL;
314- if(!g_bOpenSSLLoaded)
315- return recv(s, buf, len, flags);
316- EnterCriticalSection(&g_OpenSSLLock);
317- ppSSL = FindSSLPointerFromSocket(s);
318- LeaveCriticalSection(&g_OpenSSLLock);
319- if(!ppSSL)
320- return recv(s, buf, len, flags);
321- if(flags & MSG_PEEK)
322- return pSSL_peek(*ppSSL, buf, len);
323- return pSSL_read(*ppSSL, buf, len);
324-}
325-
1+// socketwrapper.c
2+// Copyright (C) 2011 Suguru Kawamoto
3+// ソケットラッパー
4+// socket関連関数をOpenSSL用に置換
5+// コンパイルにはOpenSSLのヘッダーファイルが必要
6+// 実行にはOpenSSLのDLLが必要
7+
8+#include <windows.h>
9+#include <mmsystem.h>
10+#include <openssl/ssl.h>
11+
12+#include "socketwrapper.h"
13+#include "protectprocess.h"
14+
15+typedef void (__cdecl* _SSL_load_error_strings)();
16+typedef int (__cdecl* _SSL_library_init)();
17+typedef SSL_METHOD* (__cdecl* _SSLv23_method)();
18+typedef SSL_CTX* (__cdecl* _SSL_CTX_new)(SSL_METHOD*);
19+typedef void (__cdecl* _SSL_CTX_free)(SSL_CTX*);
20+typedef SSL* (__cdecl* _SSL_new)(SSL_CTX*);
21+typedef void (__cdecl* _SSL_free)(SSL*);
22+typedef int (__cdecl* _SSL_shutdown)(SSL*);
23+typedef int (__cdecl* _SSL_get_fd)(SSL*);
24+typedef int (__cdecl* _SSL_set_fd)(SSL*, int);
25+typedef int (__cdecl* _SSL_accept)(SSL*);
26+typedef int (__cdecl* _SSL_connect)(SSL*);
27+typedef int (__cdecl* _SSL_write)(SSL*, const void*, int);
28+typedef int (__cdecl* _SSL_peek)(SSL*, void*, int);
29+typedef int (__cdecl* _SSL_read)(SSL*, void*, int);
30+typedef int (__cdecl* _SSL_get_error)(SSL*, int);
31+
32+_SSL_load_error_strings pSSL_load_error_strings;
33+_SSL_library_init pSSL_library_init;
34+_SSLv23_method pSSLv23_method;
35+_SSL_CTX_new pSSL_CTX_new;
36+_SSL_CTX_free pSSL_CTX_free;
37+_SSL_new pSSL_new;
38+_SSL_free pSSL_free;
39+_SSL_shutdown pSSL_shutdown;
40+_SSL_get_fd pSSL_get_fd;
41+_SSL_set_fd pSSL_set_fd;
42+_SSL_accept pSSL_accept;
43+_SSL_connect pSSL_connect;
44+_SSL_write pSSL_write;
45+_SSL_peek pSSL_peek;
46+_SSL_read pSSL_read;
47+_SSL_get_error pSSL_get_error;
48+
49+#define MAX_SSL_SOCKET 64
50+
51+BOOL g_bOpenSSLLoaded;
52+HMODULE g_hOpenSSL;
53+CRITICAL_SECTION g_OpenSSLLock;
54+DWORD g_OpenSSLTimeout;
55+LPSSLTIMEOUTCALLBACK g_pOpenSSLTimeoutCallback;
56+SSL_CTX* g_pOpenSSLCTX;
57+SSL* g_pOpenSSLHandle[MAX_SSL_SOCKET];
58+
59+BOOL __stdcall DefaultSSLTimeoutCallback()
60+{
61+ Sleep(100);
62+ return FALSE;
63+}
64+
65+BOOL LoadOpenSSL()
66+{
67+ if(g_bOpenSSLLoaded)
68+ return FALSE;
69+#ifdef ENABLE_PROCESS_PROTECTION
70+ // 同梱するOpenSSLのバージョンに合わせてSHA1ハッシュ値を変更すること
71+ // ssleay32.dll 1.0.0e
72+ // libssl32.dll 1.0.0e
73+ RegisterTrustedModuleSHA1Hash("\x4E\xB7\xA0\x22\x14\x4B\x58\x6D\xBC\xF5\x21\x0D\x96\x78\x0D\x79\x7D\x66\xB2\xB0");
74+ // libeay32.dll 1.0.0e
75+ RegisterTrustedModuleSHA1Hash("\x01\x32\x7A\xAE\x69\x26\xE6\x58\xC7\x63\x22\x1E\x53\x5A\x78\xBC\x61\xC7\xB5\xC1");
76+#endif
77+ g_hOpenSSL = LoadLibrary("ssleay32.dll");
78+ if(!g_hOpenSSL)
79+ g_hOpenSSL = LoadLibrary("libssl32.dll");
80+ if(!g_hOpenSSL
81+ || !(pSSL_load_error_strings = (_SSL_load_error_strings)GetProcAddress(g_hOpenSSL, "SSL_load_error_strings"))
82+ || !(pSSL_library_init = (_SSL_library_init)GetProcAddress(g_hOpenSSL, "SSL_library_init"))
83+ || !(pSSLv23_method = (_SSLv23_method)GetProcAddress(g_hOpenSSL, "SSLv23_method"))
84+ || !(pSSL_CTX_new = (_SSL_CTX_new)GetProcAddress(g_hOpenSSL, "SSL_CTX_new"))
85+ || !(pSSL_CTX_free = (_SSL_CTX_free)GetProcAddress(g_hOpenSSL, "SSL_CTX_free"))
86+ || !(pSSL_new = (_SSL_new)GetProcAddress(g_hOpenSSL, "SSL_new"))
87+ || !(pSSL_free = (_SSL_free)GetProcAddress(g_hOpenSSL, "SSL_free"))
88+ || !(pSSL_shutdown = (_SSL_shutdown)GetProcAddress(g_hOpenSSL, "SSL_shutdown"))
89+ || !(pSSL_get_fd = (_SSL_get_fd)GetProcAddress(g_hOpenSSL, "SSL_get_fd"))
90+ || !(pSSL_set_fd = (_SSL_set_fd)GetProcAddress(g_hOpenSSL, "SSL_set_fd"))
91+ || !(pSSL_accept = (_SSL_accept)GetProcAddress(g_hOpenSSL, "SSL_accept"))
92+ || !(pSSL_connect = (_SSL_connect)GetProcAddress(g_hOpenSSL, "SSL_connect"))
93+ || !(pSSL_write = (_SSL_write)GetProcAddress(g_hOpenSSL, "SSL_write"))
94+ || !(pSSL_peek = (_SSL_peek)GetProcAddress(g_hOpenSSL, "SSL_peek"))
95+ || !(pSSL_read = (_SSL_read)GetProcAddress(g_hOpenSSL, "SSL_read"))
96+ || !(pSSL_get_error = (_SSL_get_error)GetProcAddress(g_hOpenSSL, "SSL_get_error")))
97+ {
98+ if(g_hOpenSSL)
99+ FreeLibrary(g_hOpenSSL);
100+ g_hOpenSSL = NULL;
101+ return FALSE;
102+ }
103+ InitializeCriticalSection(&g_OpenSSLLock);
104+ pSSL_load_error_strings();
105+ pSSL_library_init();
106+ SetSSLTimeoutCallback(60000, DefaultSSLTimeoutCallback);
107+ g_bOpenSSLLoaded = TRUE;
108+ return TRUE;
109+}
110+
111+void FreeOpenSSL()
112+{
113+ int i;
114+ if(!g_bOpenSSLLoaded)
115+ return;
116+ EnterCriticalSection(&g_OpenSSLLock);
117+ for(i = 0; i < MAX_SSL_SOCKET; i++)
118+ {
119+ if(g_pOpenSSLHandle[i])
120+ {
121+ pSSL_shutdown(g_pOpenSSLHandle[i]);
122+ pSSL_free(g_pOpenSSLHandle[i]);
123+ g_pOpenSSLHandle[i] = NULL;
124+ }
125+ }
126+ if(g_pOpenSSLCTX)
127+ pSSL_CTX_free(g_pOpenSSLCTX);
128+ g_pOpenSSLCTX = NULL;
129+ FreeLibrary(g_hOpenSSL);
130+ g_hOpenSSL = NULL;
131+ LeaveCriticalSection(&g_OpenSSLLock);
132+ DeleteCriticalSection(&g_OpenSSLLock);
133+ g_bOpenSSLLoaded = FALSE;
134+}
135+
136+BOOL IsOpenSSLLoaded()
137+{
138+ return g_bOpenSSLLoaded;
139+}
140+
141+SSL** GetUnusedSSLPointer()
142+{
143+ int i;
144+ for(i = 0; i < MAX_SSL_SOCKET; i++)
145+ {
146+ if(!g_pOpenSSLHandle[i])
147+ return &g_pOpenSSLHandle[i];
148+ }
149+ return NULL;
150+}
151+
152+SSL** FindSSLPointerFromSocket(SOCKET s)
153+{
154+ int i;
155+ for(i = 0; i < MAX_SSL_SOCKET; i++)
156+ {
157+ if(g_pOpenSSLHandle[i])
158+ {
159+ if(pSSL_get_fd(g_pOpenSSLHandle[i]) == s)
160+ return &g_pOpenSSLHandle[i];
161+ }
162+ }
163+ return NULL;
164+}
165+
166+void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback)
167+{
168+ if(!g_bOpenSSLLoaded)
169+ return;
170+ EnterCriticalSection(&g_OpenSSLLock);
171+ g_OpenSSLTimeout = Timeout;
172+ g_pOpenSSLTimeoutCallback = pCallback;
173+ LeaveCriticalSection(&g_OpenSSLLock);
174+}
175+
176+BOOL AttachSSL(SOCKET s)
177+{
178+ BOOL r;
179+ DWORD Time;
180+ SSL** ppSSL;
181+ if(!g_bOpenSSLLoaded)
182+ return FALSE;
183+ r = FALSE;
184+ Time = timeGetTime();
185+ EnterCriticalSection(&g_OpenSSLLock);
186+ if(!g_pOpenSSLCTX)
187+ g_pOpenSSLCTX = pSSL_CTX_new(pSSLv23_method());
188+ if(g_pOpenSSLCTX)
189+ {
190+ if(ppSSL = GetUnusedSSLPointer())
191+ {
192+ if(*ppSSL = pSSL_new(g_pOpenSSLCTX))
193+ {
194+ if(pSSL_set_fd(*ppSSL, s) != 0)
195+ {
196+ r = TRUE;
197+ // SSLのネゴシエーションには時間がかかる場合がある
198+ while(pSSL_connect(*ppSSL) != 1)
199+ {
200+ LeaveCriticalSection(&g_OpenSSLLock);
201+ if(g_pOpenSSLTimeoutCallback() || timeGetTime() - Time >= g_OpenSSLTimeout)
202+ {
203+ DetachSSL(s);
204+ r = FALSE;
205+ EnterCriticalSection(&g_OpenSSLLock);
206+ break;
207+ }
208+ EnterCriticalSection(&g_OpenSSLLock);
209+ }
210+ }
211+ else
212+ {
213+ LeaveCriticalSection(&g_OpenSSLLock);
214+ DetachSSL(s);
215+ EnterCriticalSection(&g_OpenSSLLock);
216+ }
217+ }
218+ }
219+ }
220+ LeaveCriticalSection(&g_OpenSSLLock);
221+ return r;
222+}
223+
224+BOOL DetachSSL(SOCKET s)
225+{
226+ BOOL r;
227+ SSL** ppSSL;
228+ if(!g_bOpenSSLLoaded)
229+ return FALSE;
230+ r = FALSE;
231+ EnterCriticalSection(&g_OpenSSLLock);
232+ if(ppSSL = FindSSLPointerFromSocket(s))
233+ {
234+ pSSL_shutdown(*ppSSL);
235+ pSSL_free(*ppSSL);
236+ *ppSSL = NULL;
237+ r = TRUE;
238+ }
239+ LeaveCriticalSection(&g_OpenSSLLock);
240+ return r;
241+}
242+
243+BOOL IsSSLAttached(SOCKET s)
244+{
245+ SSL** ppSSL;
246+ if(!g_bOpenSSLLoaded)
247+ return FALSE;
248+ EnterCriticalSection(&g_OpenSSLLock);
249+ ppSSL = FindSSLPointerFromSocket(s);
250+ LeaveCriticalSection(&g_OpenSSLLock);
251+ if(!ppSSL)
252+ return TRUE;
253+ return TRUE;
254+}
255+
256+SOCKET socketS(int af, int type, int protocol)
257+{
258+ return socket(af, type, protocol);
259+}
260+
261+int bindS(SOCKET s, const struct sockaddr *addr, int namelen)
262+{
263+ return bind(s, addr, namelen);
264+}
265+
266+int listenS(SOCKET s, int backlog)
267+{
268+ return listen(s, backlog);
269+}
270+
271+SOCKET acceptS(SOCKET s, struct sockaddr *addr, int *addrlen)
272+{
273+ SOCKET r;
274+ r = accept(s, addr, addrlen);
275+ if(!AttachSSL(r))
276+ {
277+ closesocket(r);
278+ return INVALID_SOCKET;
279+ }
280+ return r;
281+}
282+
283+int connectS(SOCKET s, const struct sockaddr *name, int namelen)
284+{
285+ int r;
286+ r = connect(s, name, namelen);
287+ if(!AttachSSL(r))
288+ return SOCKET_ERROR;
289+ return r;
290+}
291+
292+int closesocketS(SOCKET s)
293+{
294+ DetachSSL(s);
295+ return closesocket(s);
296+}
297+
298+int sendS(SOCKET s, const char * buf, int len, int flags)
299+{
300+ SSL** ppSSL;
301+ if(!g_bOpenSSLLoaded)
302+ return send(s, buf, len, flags);
303+ EnterCriticalSection(&g_OpenSSLLock);
304+ ppSSL = FindSSLPointerFromSocket(s);
305+ LeaveCriticalSection(&g_OpenSSLLock);
306+ if(!ppSSL)
307+ return send(s, buf, len, flags);
308+ return pSSL_write(*ppSSL, buf, len);
309+}
310+
311+int recvS(SOCKET s, char * buf, int len, int flags)
312+{
313+ SSL** ppSSL;
314+ if(!g_bOpenSSLLoaded)
315+ return recv(s, buf, len, flags);
316+ EnterCriticalSection(&g_OpenSSLLock);
317+ ppSSL = FindSSLPointerFromSocket(s);
318+ LeaveCriticalSection(&g_OpenSSLLock);
319+ if(!ppSSL)
320+ return recv(s, buf, len, flags);
321+ if(flags & MSG_PEEK)
322+ return pSSL_peek(*ppSSL, buf, len);
323+ return pSSL_read(*ppSSL, buf, len);
324+}
325+
--- a/socketwrapper.h
+++ b/socketwrapper.h
@@ -1,29 +1,29 @@
1-// socketwrapper.h
2-// Copyright (C) 2011 Suguru Kawamoto
3-// ソケットラッパー
4-
5-#ifndef __SOCKETWRAPPER_H__
6-#define __SOCKETWRAPPER_H__
7-
8-#define USE_OPENSSL
9-
10-typedef BOOL (__stdcall* LPSSLTIMEOUTCALLBACK)();
11-
12-BOOL LoadOpenSSL();
13-void FreeOpenSSL();
14-BOOL IsOpenSSLLoaded();
15-void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback);
16-BOOL AttachSSL(SOCKET s);
17-BOOL DetachSSL(SOCKET s);
18-BOOL IsSSLAttached(SOCKET s);
19-SOCKET socketS(int af, int type, int protocol);
20-int bindS(SOCKET s, const struct sockaddr *addr, int namelen);
21-int listenS(SOCKET s, int backlog);
22-SOCKET acceptS(SOCKET s, struct sockaddr *addr, int *addrlen);
23-int connectS(SOCKET s, const struct sockaddr *name, int namelen);
24-int closesocketS(SOCKET s);
25-int sendS(SOCKET s, const char * buf, int len, int flags);
26-int recvS(SOCKET s, char * buf, int len, int flags);
27-
28-#endif
29-
1+// socketwrapper.h
2+// Copyright (C) 2011 Suguru Kawamoto
3+// ソケットラッパー
4+
5+#ifndef __SOCKETWRAPPER_H__
6+#define __SOCKETWRAPPER_H__
7+
8+#define USE_OPENSSL
9+
10+typedef BOOL (__stdcall* LPSSLTIMEOUTCALLBACK)();
11+
12+BOOL LoadOpenSSL();
13+void FreeOpenSSL();
14+BOOL IsOpenSSLLoaded();
15+void SetSSLTimeoutCallback(DWORD Timeout, LPSSLTIMEOUTCALLBACK pCallback);
16+BOOL AttachSSL(SOCKET s);
17+BOOL DetachSSL(SOCKET s);
18+BOOL IsSSLAttached(SOCKET s);
19+SOCKET socketS(int af, int type, int protocol);
20+int bindS(SOCKET s, const struct sockaddr *addr, int namelen);
21+int listenS(SOCKET s, int backlog);
22+SOCKET acceptS(SOCKET s, struct sockaddr *addr, int *addrlen);
23+int connectS(SOCKET s, const struct sockaddr *name, int namelen);
24+int closesocketS(SOCKET s);
25+int sendS(SOCKET s, const char * buf, int len, int flags);
26+int recvS(SOCKET s, char * buf, int len, int flags);
27+
28+#endif
29+