• R/O
  • SSH

コミット

タグ
未設定

よく使われているワード(クリックで追加)

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

コミットメタ情報

リビジョン635cfa50126aeb19528258de62476ab6b3c3afbb (tree)
日時2014-04-22 00:30:02
作者zolgear <>
コミッターzolgear <>

ログメッセージ

Cygwinのアーキテクチャ判定が出来なくなっていたのを修正

変更サマリ

差分

diff -r 42df141c8934 -r 635cfa50126a cyglaunch.c
--- a/cyglaunch.c Fri Dec 27 17:37:16 2013 +0900
+++ b/cyglaunch.c Tue Apr 22 00:30:02 2014 +0900
@@ -27,38 +27,52 @@
2727 //
2828 // Get Cygwin architecture
2929 //
30-WORD GetCygwinArch(const char *CygDir)
30+WORD GetCygwinArch(const char CygDir[])
3131 {
3232 WORD result = IMAGE_FILE_MACHINE_UNKNOWN;
3333 char cygdll[MAX_PATH];
34- FILE *fp = NULL;
35- IMAGE_DOS_HEADER DosHeader;
36- IMAGE_NT_HEADERS32 Cygwin1DllHeader;
34+ IMAGE_DOS_HEADER DosHeader = { 0x00 };
35+ IMAGE_NT_HEADERS32 Cygwin1DllHeader = { 0x00 };
36+ DWORD theReadBytes;
37+ HANDLE theFH = INVALID_HANDLE_VALUE;
3738
3839 strcpy(cygdll, CygDir);
3940 strcat(cygdll, "\\bin\\cygwin1.dll");
4041
4142 // Get PE header
42- fp = fopen(cygdll, "r");
43- if(fp == NULL) {
44- goto finally;
43+ if((theFH = CreateFile(cygdll, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
44+ {
45+ goto FIN;
4546 }
46- if(fread(&DosHeader, sizeof(DosHeader), 1, fp) < 1) {
47- goto finally;
47+ if(ReadFile(theFH, &DosHeader, sizeof(DosHeader), &theReadBytes, NULL) == FALSE)
48+ {
49+ goto FIN;
4850 }
49- if(fseek(fp, DosHeader.e_lfanew, SEEK_SET) != 0) {
50- goto finally;
51+ if(DosHeader.e_magic != IMAGE_DOS_SIGNATURE)
52+ {
53+ goto FIN;
5154 }
52- if(fread(&Cygwin1DllHeader, sizeof(Cygwin1DllHeader), 1, fp) < 1) {
53- goto finally;
55+ if(SetFilePointer(theFH, DosHeader.e_lfanew, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
56+ {
57+ goto FIN;
58+ }
59+ if(ReadFile(theFH, &Cygwin1DllHeader, sizeof(Cygwin1DllHeader), &theReadBytes, NULL) == FALSE)
60+ {
61+ goto FIN;
62+ }
63+ if(Cygwin1DllHeader.Signature != IMAGE_NT_SIGNATURE)
64+ {
65+ goto FIN;
5466 }
5567
5668 // check architecture
5769 result = Cygwin1DllHeader.FileHeader.Machine;
5870
59-finally:
60- if(fp != NULL) {
61- fclose(fp);
71+FIN:
72+ if(theFH != NULL && theFH != INVALID_HANDLE_VALUE)
73+ {
74+ CloseHandle(theFH);
75+ theFH = INVALID_HANDLE_VALUE;
6276 }
6377 return result;
6478 }
@@ -121,7 +135,7 @@
121135
122136 found_path:;
123137 memset(&si, 0, sizeof(si));
124- si.cb = sizeof(si);
138+ GetStartupInfo(&si);
125139 memset(&pi, 0, sizeof(pi));
126140
127141 for(i = (GetCygwinArch(CygwinDirectory) == IMAGE_FILE_MACHINE_AMD64 ? 0 : 1);
@@ -138,8 +152,6 @@
138152 NULL, NULL, FALSE, 0,
139153 NULL, curdir,
140154 &si, &pi)) {
141- CloseHandle(pi.hProcess);
142- CloseHandle(pi.hThread);
143155 break;
144156 }
145157 }