FFFTPのソースコードです。
Revision | 484a8d06abde1b0de9bd794aac5a03fb629625f0 (tree) |
---|---|
Time | 2011-10-13 07:31:26 |
Author | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix line feed codes.
@@ -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 |
@@ -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> |
@@ -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> |
@@ -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= |
@@ -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= |
@@ -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 | + |
@@ -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 | +///////////////////////////////////////////////////////////////////////////// |
@@ -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 | + |
@@ -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 |
@@ -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> |
@@ -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 | +// 追加ヘッダーを参照してください。 |
@@ -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 | + |
@@ -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 | + |
@@ -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> |
@@ -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> </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> </P></BODY></HTML> |
@@ -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> </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> </P></BODY></HTML> |
@@ -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 | + |
@@ -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 | + |
@@ -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 |
@@ -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 | +///////////////////////////////////////////////////////////////////////////// |
@@ -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 | + |
@@ -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 |
@@ -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> |
@@ -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 | +// 追加ヘッダーを参照してください。 |
@@ -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 | + |
@@ -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 | + |
@@ -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 | + |
@@ -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 | + |
@@ -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 | + |
@@ -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 | + |