No.4ベストアンサー
- 回答日時:
Windowsの実行ファイルにデータファイルをアペンドしても、実行時には元々の実行ファイルの部分しかマッピングされないので、アセンブラで書いても無意味です。
一般的には、自分自身を普通のファイルとしてオープンし、必要な部分を読み込むようにします。
PEヘッダの説明は面倒なので、アペンドされた位置までシークさせるサンプルを載せます。
TCHAR* path = new TCHAR[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
HANDLE file = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
delete path;
IMAGE_DOS_HEADER* idh = new IMAGE_DOS_HEADER;
DWORD read;
ReadFile(file, idh, sizeof(IMAGE_DOS_HEADER), &read, NULL);
SetFilePointer(file, idh->e_lfanew, NULL, FILE_BEGIN);
delete idh;
IMAGE_NT_HEADERS* inh = new IMAGE_NT_HEADERS;
ReadFile(file, inh, sizeof(IMAGE_NT_HEADERS), &read, NULL);
SetFilePointer(file, sizeof(IMAGE_SECTION_HEADER) * (inh->FileHeader.NumberOfSections - 1), NULL, FILE_CURRENT);
delete inh;
IMAGE_SECTION_HEADER* ish = new IMAGE_SECTION_HEADER;
ReadFile(file, ish, sizeof(IMAGE_SECTION_HEADER), &read, NULL);
SetFilePointer(file, ish->PointerToRawData + ish->SizeOfRawData, NULL, FILE_BEGIN);
delete ish;
// この後、データヘッダを読み込みます
No.3
- 回答日時:
アセンブラと違いCではコンパイルしてみないと
自分自身のサイズがわからないので
一度コンパイルしてからサイズを知り
その後に読み書きするデータを付加するしかないのでは。
とりあえずソースの中では大きめのアドレスをもたせておいて
データ付加の際のりしろ部分をつけてはどうでしょうか。
ありがとうございます
確保した領域が連続なのかどうか
確保した領域がexeファイルの中の後ろの部分に取られるのかどうか
が問題ですね
void main(void)
{
char data[10000000];
unsigned data_size;
・・・・・・・・・・・・・
}
においてdata_sizeの位置がわかり
dataが連続に後ろの部分に作られれば
そのエリアに上書きできるのでいいのですが・・・・
No.2
- 回答日時:
char a[]=*********;
int b[]=*******;
main()
{
}
のように、最初にデータを書いておけば、
コンパイルとリンクの後には
外部データとして
プログラムの最後の部分に
配置されるのではないでしょうか?
外部データの配置される部分のことは
マイクロソフトのアセンブラの本意書いてあったかな?
詳しいことは忘れました。
この回答への補足
void main(void)
{
char *data;
unsigned x;
.................................
data=new char[x];
........
........
.................................
delete[]data;
}
においてコンパイル後xのアドレスがプログラムの最後の次のアドレスになり
dataの領域確保でdataのアドレスがその4バイトあとのアドレスになれば言いのですが・・・
No.1
- 回答日時:
それはコンパイル後の物を読みとるのでしょうか?それともコンパイル前のソースコードのことを言っているのでしょうか?
前者であればCは構造的にコンパイルしてリンクする形になるのでなかなかそういったことは難しいのではないかと思います。
後者であればSTATIC領域にデータを納めるようなサブルーチンを一番最後においてやれば何とかなるかもしれませんね。
任意の長さのデータを制御するexeファイルを作っていて
exeファイルの後にデータ容量がヘッダとしてついているデータ(ヘッダとしてデータの大きさも)をくっつけるだけでデータを処理できるものです
例えば
.exeファイルは画像を表示する実行ファイルで
.dataファイルは画像データで
.exeと.dataをくっつけるプログラムgoo.exeを作っておいて
goo.exeが両者を合体して自己表示画像データ(合体後.exeになる)を作れるようにしたいのです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- C言語・C++・C# C言語について教えて欲しいです。 ファイルの中身をコピーするプログラムを作ってます aというファイル 7 2022/11/03 19:21
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- Excel(エクセル) Excelマクロの作成方法・コーディングをご教授ください。 3 2023/02/26 18:09
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- その他(プログラミング・Web制作) 大学のゼミのレポートがムカつきます。 R言語というデータ分析に特化したプログラム言語を用いた授業の課 1 2023/06/29 00:50
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
C言語をコンパイルするとコンピ...
-
math.hに含まれる関数が使えない
-
不明なプラグマ・・・?
-
libsshのコンパイルエラー
-
Eclipseで使えるコンパイラ、リ...
-
実行ファイルが作成環境以外のP...
-
Visual Basic.NETの処理速度は6...
-
Linux(g++)とAIX(XL C++)の挙動...
-
C#で char型とstring型の比較で...
-
cygwinのgccで正常にコンパイル...
-
実行後にコンパイルに失敗しま...
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
#If True Then の # って何??
-
define文のパラメータを実行時...
-
Verilog_HDLでのdefineとifdef
-
ヘッダーファイル『windows.h』...
-
VBで作成したOCXでバージョンが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
C言語をコンパイルするとコンピ...
-
実行後にコンパイルに失敗しま...
-
math.hに含まれる関数が使えない
-
ビープ音が鳴りません・・・
-
c言語です コンパイルした時に...
-
<math.h>ヘッダを入力している...
-
C#で char型とstring型の比較で...
-
共有ライブラリの内容確認について
-
すべてのリビルド: 0 正常、 0 ...
-
[COBOL] ソースの復帰
-
64ビットのlinuxで32ビットメモ...
-
VS2010環境で2点ほど質問
-
gcc バージョン違いによるコン...
-
ヘッダーファイル『windows.h』...
-
C言語で作ったらWindowsでもMac...
-
自作DLLの中身を暗号化
-
MVSマシンで0C7でABENDしたので...
-
Verilog_HDLでのdefineとifdef
おすすめ情報