Changeset 81 for trunk/kLdr/kLdrModPE.c
- Timestamp:
- Aug 19, 2016, 12:10:38 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrModPE.c
r79 r81 121 121 PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 122 122 static int kldrModPEDoImports(PKLDRMODPE pModPE, void *pvMapping, PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser); 123 static int kldrModPEDoCallDLL(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle);124 static int kldrModPEDoCallTLS(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle);123 static int kldrModPEDoCallDLL(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle); 124 static int kldrModPEDoCallTLS(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle); 125 125 static KI32 kldrModPEDoCall(KUPTR uEntrypoint, KUPTR uHandle, KU32 uOp, void *pvReserved); 126 126 … … 1283 1283 1284 1284 /** @copydoc kLdrModAllocTLS */ 1285 static int kldrModPEAllocTLS(PKLDRMOD pMod )1285 static int kldrModPEAllocTLS(PKLDRMOD pMod, void *pvMapping) 1286 1286 { 1287 1287 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 1290 1290 * Mapped? 1291 1291 */ 1292 if (!pModPE->pvMapping) 1293 return KLDR_ERR_NOT_MAPPED; 1292 if (pvMapping == KLDRMOD_INT_MAP) 1293 { 1294 pvMapping = pModPE->pvMapping; 1295 if (!pvMapping) 1296 return KLDR_ERR_NOT_MAPPED; 1297 } 1294 1298 1295 1299 /* … … 1305 1309 1306 1310 /** @copydoc kLdrModFreeTLS */ 1307 static void kldrModPEFreeTLS(PKLDRMOD pMod )1311 static void kldrModPEFreeTLS(PKLDRMOD pMod, void *pvMapping) 1308 1312 { 1309 1313 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 1312 1316 * Mapped? 1313 1317 */ 1314 if (!pModPE->pvMapping) 1315 return; 1318 if (pvMapping == KLDRMOD_INT_MAP) 1319 { 1320 pvMapping = pModPE->pvMapping; 1321 if (!pvMapping) 1322 return; 1323 } 1316 1324 1317 1325 /* … … 1709 1717 1710 1718 /** @copydoc kLdrModCallInit */ 1711 static int kldrModPECallInit(PKLDRMOD pMod, KUPTR uHandle)1719 static int kldrModPECallInit(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle) 1712 1720 { 1713 1721 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 1717 1725 * Mapped? 1718 1726 */ 1719 if (!pModPE->pvMapping) 1720 return KLDR_ERR_NOT_MAPPED; 1727 if (pvMapping == KLDRMOD_INT_MAP) 1728 { 1729 pvMapping = pModPE->pvMapping; 1730 if (!pvMapping) 1731 return KLDR_ERR_NOT_MAPPED; 1732 } 1721 1733 1722 1734 /* 1723 1735 * Do TLS callbacks first and then call the init/term function if it's a DLL. 1724 1736 */ 1725 rc = kldrModPEDoCallTLS(pModPE, DLL_PROCESS_ATTACH, uHandle);1737 rc = kldrModPEDoCallTLS(pModPE, pvMapping, DLL_PROCESS_ATTACH, uHandle); 1726 1738 if ( !rc 1727 1739 && (pModPE->Hdrs.FileHeader.Characteristics & IMAGE_FILE_DLL)) 1728 1740 { 1729 rc = kldrModPEDoCallDLL(pModPE, DLL_PROCESS_ATTACH, uHandle);1741 rc = kldrModPEDoCallDLL(pModPE, pvMapping, DLL_PROCESS_ATTACH, uHandle); 1730 1742 if (rc) 1731 kldrModPEDoCallTLS(pModPE, DLL_PROCESS_DETACH, uHandle);1743 kldrModPEDoCallTLS(pModPE, pvMapping, DLL_PROCESS_DETACH, uHandle); 1732 1744 } 1733 1745 … … 1742 1754 * @returns KLDR_ERR_MODULE_INIT_FAILED or KLDR_ERR_THREAD_ATTACH_FAILED on failure. 1743 1755 * @param pModPE The PE module interpreter instance. 1756 * @param pvMapping The module mapping to use (resolved). 1744 1757 * @param uOp The operation (DLL_*). 1745 1758 * @param uHandle The module handle to present. 1746 1759 */ 1747 static int kldrModPEDoCallDLL(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle)1760 static int kldrModPEDoCallDLL(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle) 1748 1761 { 1749 1762 int rc; … … 1758 1771 * Invoke the entrypoint and convert the boolean result to a kLdr status code. 1759 1772 */ 1760 rc = kldrModPEDoCall((KUPTR)pModPE->pvMapping + pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint, 1761 uHandle, uOp, NULL); 1773 rc = kldrModPEDoCall((KUPTR)pvMapping + pModPE->Hdrs.OptionalHeader.AddressOfEntryPoint, uHandle, uOp, NULL); 1762 1774 if (rc) 1763 1775 rc = 0; … … 1778 1790 * @returns KLDR_ERR_THREAD_ATTACH_FAILED on failure. 1779 1791 * @param pModPE The PE module interpreter instance. 1792 * @param pvMapping The module mapping to use (resolved). 1780 1793 * @param uOp The operation (DLL_*). 1781 1794 * @param uHandle The module handle to present. 1782 1795 */ 1783 static int kldrModPEDoCallTLS(PKLDRMODPE pModPE, unsigned uOp, KUPTR uHandle)1796 static int kldrModPEDoCallTLS(PKLDRMODPE pModPE, void *pvMapping, unsigned uOp, KUPTR uHandle) 1784 1797 { 1785 1798 /** @todo implement TLS support. */ 1786 1799 K_NOREF(pModPE); 1800 K_NOREF(pvMapping); 1787 1801 K_NOREF(uOp); 1788 1802 K_NOREF(uHandle); … … 1862 1876 1863 1877 /** @copydoc kLdrModCallTerm */ 1864 static int kldrModPECallTerm(PKLDRMOD pMod, KUPTR uHandle)1878 static int kldrModPECallTerm(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle) 1865 1879 { 1866 1880 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 1869 1883 * Mapped? 1870 1884 */ 1871 if (!pModPE->pvMapping) 1872 return KLDR_ERR_NOT_MAPPED; 1885 if (pvMapping == KLDRMOD_INT_MAP) 1886 { 1887 pvMapping = pModPE->pvMapping; 1888 if (!pvMapping) 1889 return KLDR_ERR_NOT_MAPPED; 1890 } 1873 1891 1874 1892 /* 1875 1893 * Do TLS callbacks first. 1876 1894 */ 1877 kldrModPEDoCallTLS(pModPE, DLL_PROCESS_DETACH, uHandle);1895 kldrModPEDoCallTLS(pModPE, pvMapping, DLL_PROCESS_DETACH, uHandle); 1878 1896 if (pModPE->Hdrs.FileHeader.Characteristics & IMAGE_FILE_DLL) 1879 kldrModPEDoCallDLL(pModPE, DLL_PROCESS_DETACH, uHandle);1897 kldrModPEDoCallDLL(pModPE, pvMapping, DLL_PROCESS_DETACH, uHandle); 1880 1898 1881 1899 return 0; … … 1884 1902 1885 1903 /** @copydoc kLdrModCallThread */ 1886 static int kldrModPECallThread(PKLDRMOD pMod, KUPTR uHandle, unsigned fAttachingOrDetaching)1904 static int kldrModPECallThread(PKLDRMOD pMod, void *pvMapping, KUPTR uHandle, unsigned fAttachingOrDetaching) 1887 1905 { 1888 1906 PKLDRMODPE pModPE = (PKLDRMODPE)pMod->pvData; … … 1891 1909 1892 1910 /* 1911 * Mapped? 1912 */ 1913 if (pvMapping == KLDRMOD_INT_MAP) 1914 { 1915 pvMapping = pModPE->pvMapping; 1916 if (!pvMapping) 1917 return KLDR_ERR_NOT_MAPPED; 1918 } 1919 1920 /* 1893 1921 * Do TLS callbacks first and then call the init/term function if it's a DLL. 1894 1922 */ 1895 rc = kldrModPEDoCallTLS(pModPE, uOp, uHandle);1923 rc = kldrModPEDoCallTLS(pModPE, pvMapping, uOp, uHandle); 1896 1924 if (!fAttachingOrDetaching) 1897 1925 rc = 0; … … 1899 1927 && (pModPE->Hdrs.FileHeader.Characteristics & IMAGE_FILE_DLL)) 1900 1928 { 1901 rc = kldrModPEDoCallDLL(pModPE, uOp, uHandle);1929 rc = kldrModPEDoCallDLL(pModPE, pvMapping, uOp, uHandle); 1902 1930 if (!fAttachingOrDetaching) 1903 1931 rc = 0; 1904 1932 if (rc) 1905 kldrModPEDoCallTLS(pModPE, uOp, uHandle);1933 kldrModPEDoCallTLS(pModPE, pvMapping, uOp, uHandle); 1906 1934 } 1907 1935
Note:
See TracChangeset
for help on using the changeset viewer.