ゴミ捨て場

ここにお探しの情報はありません。帰れ。
<< April 2012 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>
 
ここは広告欄の村です
CATEGORIES
RECENT COMMENT
RECENT TRACKBACK
MOBILE
qrcode
無料ブログ作成サービス JUGEM
 
*
http://cpplover.blogspot.jp/2012/04/gnulinux_16.html

そういう主張をしている人間がキモイので近寄りたくない & 仲間になりたくないから
VC++11βで作った実行ファイルをXPで 動かそうと思ったけどめんどくさくなった
-- 追記ここから --
タイトルに書いている通りここにXPで動かす方法は置いていない
下を読む必要はないからこっちに行け
VisualStudio11作成アプリをWinXP上で動作させるHACK
-- 追記ここまで --
本題に入る前になぜ新しいVC++で作った実行ファイルが古いWindowsで動かなくなるのかの説明を
このへんちゃんと説明してるページが無いように感じたから
基本は2点
・リンカが設定するサブシステムバージョンが実行するWindowsよりも上
・リンクされるランタイムライブラリが実行するWindowsに無いAPIを読んでいる

まず前者
実行ファイルのヘッダには要求するサブシステムバージョンを設定するフィールドがあって
if ( Windows自身のメジャーバージョン > 実行ファイルが要求するメジャーバージョン || Windows自身のメジャーバージョン == 実行ファイルが要求するメジャーバージョン && Windows自身のマイナーバージョン >= 実行ファイルが要求するマイナーバージョン )
実行を許可
else
実行を拒否
みたいに要求されているバージョンを満たしているかチェックしてる
XPだとメジャー = 5、マイナー = 1、よく耳にする5.1とかそのままの理解でおk
NT 3.1が実はマイナー = 0xA(10)なのはトリビア
で実行ファイルに設定されるほうはVC++2008なら5.0、2010なら5.1のように設定される
(APIの話は置いといて)VC++2010で作った実行ファイルはWindows 2000では5.0 < 5.1なので実行できなくなる
IMAGE_OPTIONAL_HEADER structure
チェックされるのはMajorSubsystemVersion/MinorSubsystemVersionの方でMajorOperatingSystemVersion/MinorOperatingSystemVersionやMajorImageVersion/MinorImageVersionは一切チェックされないので注意。
解決法は書き換えるだけ
ファイルに設定されているだけだから
以前言った通りVC++2010なら規定では5.1に設定するけど明示的に5.0を指定することは可能
残念ながらVC++11では6.0よりも小さい値を指定することはできなくなったのでバイナリエディタでも使えばいいんじゃないですかね
APIの話に比べたら簡単なもんです

で、後者のAPI
俺Windows 2000で使えないAPI呼び出してないよ?ちゃんとGetProcAddress使ってるよ?という人は下のページを読んでくることをお勧めする
exeファイルとCRT
VC++付属のランタイムライブラリを使用しないというのはこの暗黙に呼び出されるAPIを無くすのが目的
VC++付属のものではなくDDK/WDKに入ってるものを使用するという手法も古いWindowsには無いAPIを呼び出していないランライムに差し替えることが目的
ただランタイムを使わないってのにも当然デメリットがあって
・C言語由来のものが使えない
・C++由来のものが使えない
・スタートアップコードが無いのでmainやWinMainの引数をだれも用意してくれない
・/GSが使えない(bufferoverflowU.libで代用可)
・__try、__except、__finallyが使えない(SEHはWindowsの機構ではあるがこれらのキーワードはVC++が用意してくれているラッパー)
・SafeSEH用のMagic sectionがランタイムライブラリの中(自分で用意すれば代用可)
ぱっと思いつくだけでもこんだけ
WDK/DDKのもので代用してもデバイスドライバやWindowsのコア部分用に作られているのでstd::vectorすら使えなくなる
ベターCですら辛いかもね
そうなるとランタイムライブラリはVC++付属のものを使って使えないAPIだけ挿げ替えたくなるのもわかるでしょう?
で、APIだけ挿げ替える方法が こことか こことか こことか こことか になるわけ

本題

上で言った通りサブシステムバージョンが6.0なのは自分で何とかしてください
APIに関してはXPで使えないのはGetTickCount64、LCMapStringEx、FlsAlloc、FlsSetValue、FlsGetValue、FlsFree
ランタイムを静的リンクするようにしてこれこれ
.asmのコンパイル方法はいつも通りこの辺

技術的に出てきそうな疑問
Q. GetTickCount64をGetTickCountに置き換えて大丈夫なのか?
A. 時間を取得する用途ではなくGS Cookieの初期化の為の予測困難な値の取得に使用しているのでまともな値に補正する必要性は無いと考えた

Q. LCMapStringExをLCMapStringWに置き換えて大丈夫なのか?
A. 大丈夫じゃねーの?(根拠無し)

Q. Fls APIをTls APIに置き換えて大丈夫なのか?
A. 大丈夫だろう
リソースリークが問題になるような所に保証も何もないこんなもん使用すべきじゃない
VC++がTlsからFlsに移った経緯でも調べておけ

Q. なんでVC2003〜2010のようにFlsが使用可能ならFlsを使うようにしないの?
A. めんどい

Q. 静的じゃないとだめなの?
A. 動的だとDLLを差し替えることになる
大変めんどい


他にも4つぐらいAPI使ってたけどなんかそこまでして動かす価値があるかなぁって思い始めた
localeめんどくせえわ
気が向いたら続きやるかもね
For x86 and x64 machines, the default commit value is 4 KB.
Visual C++が実行ファイルに設定するヒープ、スタックの初期コミットサイズが8KB?
その情報の出どころ教えてくれよ俺からはMSDNライブラリ出すからさ
もっと古いページも持ってきますよ

If you fail to indicate the heap size in either method, the linker uses the default values of 0x100000 (1 MB) reserved address space and 0x1000 (4K) committed memory.

The linker for the second beta release of Windows NT marks all executable applications with 0x1000 (4K) initial committed memory for the default heap size, regardless of the value indicated as an option.


つーか2ページは中途半端だろ感覚的に
きれいだったなあ(笑)

ちなみに、最初にNTFSがサポートされたWindows NT 3.1には「8+3の短いファイル名」という機能はもともと無かったのだね。

は?
NTVDMの為に存在する機構がDOS全盛期のNTに存在しないと?

スペースをまともに扱えないソフトが救済されてしまったのはたまたま

GetShortPathName() APIがNT 3.1では使えなかったからそんな勘違いしたのかい?
単機能を切り出しただけのAPIなのに
そんな事言ったらGetLongPathName() APIはどうなるんだよ
書いてあるじゃないかFindFirstFile() API使えって
ソースはlcc-win32でコンパイルしたものをPEヘッダのサブシステムバージョン書き換え(4.0→3.a)で実行
AFTのHDDの出荷以降1シリンダ=63セクタなどというバカ記事/日記が増えている
じゃあなんで最初のパーティションだけシリンダアライメントじゃなくてヘッドアライメントかっつったら
あの時代にそんなこと、MBRがある最初のシリンダが丸々使えないなんてことしたらもったいないからだよ
2重拡張子や空白だと思ってる奴は情弱
ファイル名を偽装したウイルスに注意、IPAが呼び掛け
拡張子を表示しろと言ってる情強気取りが笑える
拡張子を表示しているスクリーンショットなのにあいつらにはそれが理解できないようだ
ITmediaの記事内容も駄目な気はするが
さらにドヤ顔で説明したつもりで間違ってるアホ
お前の説明を借りるならファイル名はこう
***(U+202E)fdp.exe
左からpdfという順で書いてる時点でこの手法を何も理解していない

まぁ馬鹿は脊髄反射してないでちゃんとIPAの発表を読むんだな
分かりやすく図入りで説明してるから

あそこで拡張子を表示しろと言ってるメクラはもれなく引っかかるでしょうな
一次ソースも根拠or検証も書かれてないカスタマイズ、チューニング記事なんざ読む価値ないんだが
カスタマイズ、ねぇ・・・
UACを無効にするぐらいなら有効のまま非通知にして欲しいもんですよ
IEChromeAdobe ReaderではUACの機構を利用してより強固なサンドボックスを創り上げてんだから
UACを無効にするってのは上っ面だけのもんじゃねえぞ
Windows Integrity MechanismそのものがOFFになるってことなんだからな
WIMを利用するサンドボックスがXP相当にまで落ちるって事だ
そういうデメリットちゃんと初心者共に説明してる?
何言ってんだかわからない
はてなブックマーク - InfoQ: MozillaがJavaをブラックリストに入れることを検討

いやいや、エンタープライズ方面でまだまだ現役でしょ? やり口がどんどん横暴になってきた気がするぞ/しかしプラグインフリーがそんなに良いものかね。ブラウザベンダによる寡占状態を生み出すだけではないのか。

ブラウザプラグインとエンタープライズでのJavaがどう関係すんのかさっぱりわからない
お前のエンタープライズってクライアントのブラウザ内で動くアプレットを使う物を言うの?
Javaカ
いま一番危ない脆弱性は何だ? 〜2011年版〜 - 今週のSecurity Check:ITpro

あいつら自分の製品がよく狙われる対象だって自覚してないんだろうな
でなきゃ
・月に一度しか更新確認しない
・確認間隔を変更するのにユーザーが「管理者として実行」しなければいけない(昇格要求しないし、設定に失敗してるのにエラーメッセージも出さない)
・アップデートする度にその設定を月一回にリセットする
なんて馬鹿なコーディングはしないよ

サーバーサイドでだけ生き残ってくださいホント
クライアントにJREを要求するシステムは死んでいい
chie65535
mallocの挙動について | OKWave

あまりにもバカすぎて話しにならねえ
まず仮想メモリと物理メモリの区別がついてねえし
Windows APIのメモリ関係のAPIで負数をエラー値として返すものがあるなら出してみろ

で、またお前か
相変わらずの回答を繰り返しているようで

回答内容が著しく間違っているって通報は出来無いの?

Copyright (C) 2012 JUGEM Some Rights Reserved.