My備忘録(又の名を雑記帳)

WinMacのMy備忘録(IT系?)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- | スポンサー広告 | トラックバック(-) | コメント(-) | このエントリーをブックマークに追加する | このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク | [*Edit] |
メモ。
static unsigned int pelength;
static unsigned int peheader;

static bfd_boolean
coff_read_word (bfd *abfd, unsigned int *value)
{
unsigned char b[2];
int status;

status = bfd_bread (b, (bfd_size_type) 2, abfd);
if (status < 1)
{
*value = 0;
return FALSE;
}

if (status == 1)
*value = (unsigned int) b[0];
else
*value = (unsigned int) (b[0] + (b[1] << 8));

pelength += (unsigned int) status;

return TRUE;
}

static unsigned int
coff_compute_checksum (bfd *abfd)
{
bfd_boolean more_data;
file_ptr filepos;
unsigned int value;
unsigned int total;

total = 0;
pelength = 0;
filepos = (file_ptr) 0;

do
{
if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
return 0;

more_data = coff_read_word (abfd, &value);
total += value;
total = 0xffff & (total + (total >> 0x10));
filepos += 2;
}
while (more_data);

return (0xffff & (total + (total >> 0x10)));
}

static bfd_boolean
coff_apply_checksum (bfd *abfd)
{
unsigned int computed;
unsigned int checksum = 0;

if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0)
return FALSE;

if (!coff_read_word (abfd, &peheader))
return FALSE;

if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
return FALSE;

checksum = 0;
bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);

if (bfd_seek (abfd, peheader, SEEK_SET) != 0)
return FALSE;

computed = coff_compute_checksum (abfd);

checksum = computed + pelength;

if (bfd_seek (abfd, peheader + 0x58, SEEK_SET) != 0)
return FALSE;

bfd_bwrite (&checksum, (bfd_size_type) 4, abfd);

return TRUE;
}

MinGWbinutils-2.20.1-src.tar.gz ファイルの bfd\coffcode.h から抜粋。(GPL)
詳しいLicenseはこちら

ただ、Win32 APIを使えるのであれば、MapFileAndCheckSum や CheckSumMappedFile を使った方がいいと思う。
ライセンスの問題もあるし。

PEヘッダは、仕様書と併せてソースを読むと分かりやすい。
Wineのソースも参考に。

関連記事
2010.03.17 | memo | トラックバック(0) | コメント(0) | このエントリーをブックマークに追加する | このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク | [*Edit] |

関連しているかもしれない記事一覧















管理者にだけ閲覧を許可する

トラックバックURL↓


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。