2

絶対パス(他の場所でプログラムで決定)を介していくつかの異なるファイルを開こうとしているので、SHA1ハッシュ*を取得できます。そのうちのいくつかはコアWindowsファイルです。fopen()は、次のようにファイルを開こうとすると、一部の(すべてではない)ファイルでNULLを返します(通常、ファイル名はQueryFullProcessImageNameを介して取得されますが、念のためハードコーディングしました)。

char * filename = "c:\\windows\\system32\\spoolsv.exe";
FILE * currFileRead = fopen(filename, "rb");
if (currFileRead == NULL)
{
    printf("Failed to open %s, error %s\n", filename, strerror(errno) );
}
else
{
    //hashing code
}

報告されたエラーは2:「そのようなファイルまたはディレクトリはありません」ですが、明らかにそれらはそこにあります。また、spoolsv.exeやwinlogon.exeなどの一部のプロセスでのみ失敗しますが、svchost.exeとwininint.exeは正常に開くようです。

私のプログラムには管理者権限がありますが、一部のプロセスが失敗し、他のプロセスが問題なく開いた理由がわかりません。

*パーミッシブライセンスのあるオープンソースであるLibTomCrypt(http://libtom.org/?page=features )のメソッドを使用しています。sha1_processの呼び出しには、hash_state(ライブラリの内部)、unsigned charバッファー、およびバッファーの長さが含まれます。ハッシュ用にファイルをメモリに入れるには、fopenでファイルを読み取る必要があります。

4

2 に答える 2

3

プログラムは32ビットプロセスであるため、開こうとすると、c:\windows\system32実際にc:\windows\syswow64は同じファイルがすべて含まれているわけではありません。

IsWow64Process64ビットシステムで実行しているかどうかを判断するために使用できます。そうである場合は、Windows2003またはWindowsXPをサポートする必要がない限り、パス内のをで置き換えsystem32て実際のファイルを開くことができます。sysnative状況によっては、Windowsフォルダがないc:\windows可能性や。という名前の他のフォルダがある可能性に対処する必要があるかもしれませんsystem32

全体として、アプリケーションの32ビットバージョンと64ビットバージョンを別々に使用するか、問題が発生している特定の部分だけを使用する方が堅牢です。適切なバージョンをインストールするのはユーザーに任せられない場合は、インストーラーがどちらをインストールするかを決定できます。または、常に両方をインストールして、64で実行しているときに32ビットバージョンで64ビットバージョンを自動的に起動することもできます。 -ビットシステム。

于 2013-02-21T01:33:00.337 に答える
0

開きたいファイルが使用中で、それを使用しているプログラムがそのファイルをロックしている場合、そのファイルを開いて読み取ることができないため、管理者権限を持っているだけでは必ずしも十分ではありません。

于 2013-02-20T22:00:54.917 に答える