[USB-BRINGUP-TRUNK]
[reactos.git] / dll / win32 / fusion / assembly.c
index bc187ac..a3abc4e 100644 (file)
@@ -146,7 +146,7 @@ static VOID *assembly_data_offset(ASSEMBLY *assembly, ULONG offset)
 #define MAX_TABLES_3BIT_ENCODE 8191
 #define MAX_TABLES_5BIT_ENCODE 2047
 
-static inline ULONG get_table_size(ASSEMBLY *assembly, DWORD index)
+static inline ULONG get_table_size(const ASSEMBLY *assembly, DWORD index)
 {
     DWORD size;
     INT tables;
@@ -731,11 +731,11 @@ HRESULT assembly_release(ASSEMBLY *assembly)
     return S_OK;
 }
 
-static LPWSTR assembly_dup_str(ASSEMBLY *assembly, DWORD index)
+static LPWSTR assembly_dup_str(const ASSEMBLY *assembly, DWORD index)
 {
     int len;
     LPWSTR cpy;
-    LPSTR str = (LPSTR)&assembly->strings[index];
+    LPCSTR str = (LPCSTR)&assembly->strings[index];
 
     len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
 
@@ -772,7 +772,7 @@ HRESULT assembly_get_name(ASSEMBLY *assembly, LPWSTR *name)
     return S_OK;
 }
 
-HRESULT assembly_get_path(ASSEMBLY *assembly, LPWSTR *path)
+HRESULT assembly_get_path(const ASSEMBLY *assembly, LPWSTR *path)
 {
     LPWSTR cpy = HeapAlloc(GetProcessHeap(), 0, (strlenW(assembly->path) + 1) * sizeof(WCHAR));
     *path = cpy;
@@ -811,6 +811,20 @@ HRESULT assembly_get_version(ASSEMBLY *assembly, LPWSTR *version)
     return S_OK;
 }
 
+BYTE assembly_get_architecture(ASSEMBLY *assembly)
+{
+    if ((assembly->corhdr->MajorRuntimeVersion == 2) && (assembly->corhdr->MinorRuntimeVersion == 0))
+        return 0; /* .NET 1.x assembly */
+
+    if (assembly->nthdr->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+        return peAMD64; /* AMD64/IA64 assembly */
+
+    if ((assembly->corhdr->Flags & COMIMAGE_FLAGS_ILONLY) && !(assembly->corhdr->Flags & COMIMAGE_FLAGS_32BITREQUIRED))
+        return peMSIL; /* MSIL assembly */
+
+    return peI386; /* x86 assembly */
+}
+
 static BYTE *assembly_get_blob(ASSEMBLY *assembly, WORD index, ULONG *size)
 {
     return GetData(&assembly->blobs[index], size);