Я не думаю, что можно получить как счетчик из графика api, вы должны использовать таблицу FQL link_stat . FQL не устарел.
(из другого Q, после удаления)
Тип машины: это небольшой фрагмент кода, который я основал на некоторых, которые получают временную метку компоновщика. Это находится в том же заголовке, и кажется, что это работает - он возвращает I386 при компиляции -any cpu- и x64 при компиляции с этим в качестве целевой платформы.
Запись в блоге Exploring PE Headers (K. Stanton, MSDN) это показало мне смещение, как отмечалось в другом ответе.
public enum MachineType {
Native = 0, I386 = 0x014c, Itanium = 0x0200, x64 = 0x8664
}
public static MachineType GetMachineType(string fileName)
{
const int PE_POINTER_OFFSET = 60;
const int MACHINE_OFFSET = 4;
byte[] data = new byte[4096];
using (Stream s = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
s.Read(data, 0, 4096);
}
// dos header is 64 bytes, last element, long (4 bytes) is the address of the PE header
int PE_HEADER_ADDR = BitConverter.ToInt32(data, PE_POINTER_OFFSET);
int machineUint = BitConverter.ToUInt16(data, PE_HEADER_ADDR + MACHINE_OFFSET);
return (MachineType)machineUint;
}
Вам нужна функция GetBinaryType win32. Это возвратит соответствующие части исполняемого файла формата PE.
Как правило, Вы получите или SCS_32BIT_BINARY или SCS_64BIT_BINARY в поле BinaryType,
Alternativaly можно проверить сам формат PE для наблюдения, для какой архитектуры исполняемый файл компилируется.
поле IMAGE_FILE_HEADER.Machine будет иметь набор "IMAGE_FILE_MACHINE_IA64" для двоичных файлов IA64, IMAGE_FILE_MACHINE_I386 для 32-разрядного и IMAGE_FILE_MACHINE_AMD64 для 64-разрядного (т.е. x86_64).
существует статья MSDN Magazine, чтобы помочь Вам начать.
Приложение: Это может помочь Вам немного больше. Вы читаете двоичный файл как файл: проверьте, что первые 2 байта говорят "MZ", затем пропускают следующие 58 байтов и читают волшебное 32-разрядное значение на уровне 60 байтов в изображение (который равняется 0x00004550 для исполняемых файлов PE). Следующие байты этот заголовок , первые 2 байта которого говорят Вам, какая машина двоичный файл разработана для (0x8664 = x86_64, 0x0200 = IA64, 0x014c = i386).
(резюме: считайте байты 65 и 66 из файла для получения типа изображения)
Assembly assembly = Assembly.LoadFile(Path.GetFullPath("ConsoleApplication1.exe"));
Module manifestModule = assembly.ManifestModule;
PortableExecutableKinds peKind;
ImageFileMachine machine;
manifestModule.GetPEKind(out peKind, out machine);
целевая машина должна тогда быть в машине.
Это будет только работать с блоками.NET все же.
Я могу предложить ссылка на некоторый код C# для доступа к IMAGE_FILE_HEADER, который я думаю, мог быть (легко) скомпилирован в PowerShell cmdlet. Я довольно уверен, что Вы не можете использовать тот метод в сценарии PowerShell непосредственно, так как это испытывает недостаток в указателях и возможности PInvoke.
Однако необходимо быть в состоянии использовать Ваш к настоящему времени обширные знания формата заголовка PE;-), чтобы просто перейти "прямо" к правильным байтам и понять его. Это будет работа в сценарии PowerShell, и необходимо быть в состоянии просто преобразовать этот код C# от блога Tasos до сценария. Я не потружусь повторять код здесь, так как это не является моим.
ОС Unix имеет утилиту, названную "файлом", который определяет файлы. Правила для идентификации сохранены в файле описания, названном "волшебством". Вы могли попробовать файл, чтобы видеть, в состоянии ли он определить Ваши файлы правильно и захватить соответствующие правила из волшебного файла.