Changeset 57 for trunk/src/helpers/dosh2.c
- Timestamp:
- Apr 9, 2001, 10:50:16 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/helpers/dosh2.c
r56 r57 810 810 *@@changed V0.9.1 (2000-02-13) [umoeller]: fixed 32-bits flag 811 811 *@@changed V0.9.7 (2000-12-20) [lafaix]: fixed ulNewHeaderOfs 812 *@@changed V0.9.10 (2001-04-08) [umoeller]: now setting ppExec only if NO_ERROR is returned 812 813 */ 813 814 … … 819 820 ULONG ulAction = 0; 820 821 HFILE hFile; 822 PEXECUTABLE pExec = NULL; 821 823 822 824 if (!ppExec) 823 825 return (ERROR_INVALID_PARAMETER); 824 826 825 *ppExec = (PEXECUTABLE)malloc(sizeof(EXECUTABLE));826 if (!( *ppExec))827 pExec = (PEXECUTABLE)malloc(sizeof(EXECUTABLE)); 828 if (!(pExec)) 827 829 return (ERROR_NOT_ENOUGH_MEMORY); 828 830 829 memset( (*ppExec), 0, sizeof(EXECUTABLE));831 memset(pExec, 0, sizeof(EXECUTABLE)); 830 832 831 833 if (!(arc = DosOpen((PSZ)pcszExecutable, … … 850 852 851 853 // read old DOS EXE header 852 (*ppExec)->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER));853 if (!( (*ppExec)->pDosExeHeader))854 pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER)); 855 if (!(pExec->pDosExeHeader)) 854 856 arc = ERROR_NOT_ENOUGH_MEMORY; 855 857 else … … 862 864 &ulLocal))) // out: new offset 863 865 && (!(arc = DosRead(hFile, 864 (*ppExec)->pDosExeHeader,866 pExec->pDosExeHeader, 865 867 sizeof(DOSEXEHEADER), 866 &( (*ppExec)->cbDosExeHeader))))868 &(pExec->cbDosExeHeader)))) 867 869 ) 868 870 { 869 871 // now check if we really have a DOS header 870 if ( (*ppExec)->pDosExeHeader->usDosExeID != 0x5a4d)872 if (pExec->pDosExeHeader->usDosExeID != 0x5a4d) 871 873 arc = ERROR_INVALID_EXE_SIGNATURE; 872 874 else 873 875 { 874 876 // we have a DOS header: 875 if ( (*ppExec)->pDosExeHeader->usRelocTableOfs < 0x40)877 if (pExec->pDosExeHeader->usRelocTableOfs < 0x40) 876 878 { 877 879 // neither LX nor PE nor NE: 878 (*ppExec)->ulOS = EXEOS_DOS3;879 (*ppExec)->ulExeFormat = EXEFORMAT_OLDDOS;880 pExec->ulOS = EXEOS_DOS3; 881 pExec->ulExeFormat = EXEFORMAT_OLDDOS; 880 882 } 881 883 else … … 886 888 887 889 if ( (!(arc = DosSetFilePtr(hFile, 888 (*ppExec)->pDosExeHeader->ulNewHeaderOfs,890 pExec->pDosExeHeader->ulNewHeaderOfs, 889 891 FILE_BEGIN, 890 892 &ulLocal))) … … 900 902 // reset file ptr 901 903 DosSetFilePtr(hFile, 902 (*ppExec)->pDosExeHeader->ulNewHeaderOfs,904 pExec->pDosExeHeader->ulNewHeaderOfs, 903 905 FILE_BEGIN, 904 906 &ulLocal); … … 907 909 { 908 910 // New Executable: 909 (*ppExec)->ulExeFormat = EXEFORMAT_NE;911 pExec->ulExeFormat = EXEFORMAT_NE; 910 912 // allocate NE header 911 (*ppExec)->pNEHeader = (PNEHEADER)malloc(sizeof(NEHEADER));912 if (!( (*ppExec)->pNEHeader))913 pExec->pNEHeader = (PNEHEADER)malloc(sizeof(NEHEADER)); 914 if (!(pExec->pNEHeader)) 913 915 arc = ERROR_NOT_ENOUGH_MEMORY; 914 916 else 915 917 // read in NE header 916 918 if (!(arc = DosRead(hFile, 917 (*ppExec)->pNEHeader,919 pExec->pNEHeader, 918 920 sizeof(NEHEADER), 919 &( (*ppExec)->cbNEHeader))))920 if ( (*ppExec)->cbNEHeader == sizeof(NEHEADER))921 pbCheckOS = &( (*ppExec)->pNEHeader->bTargetOS);921 &(pExec->cbNEHeader)))) 922 if (pExec->cbNEHeader == sizeof(NEHEADER)) 923 pbCheckOS = &(pExec->pNEHeader->bTargetOS); 922 924 } 923 925 else if ( (memcmp(achNewHeaderType, "LX", 2) == 0) … … 927 929 { 928 930 // OS/2 Linear Executable: 929 (*ppExec)->ulExeFormat = EXEFORMAT_LX;931 pExec->ulExeFormat = EXEFORMAT_LX; 930 932 // allocate LX header 931 (*ppExec)->pLXHeader = (PLXHEADER)malloc(sizeof(LXHEADER));932 if (!( (*ppExec)->pLXHeader))933 pExec->pLXHeader = (PLXHEADER)malloc(sizeof(LXHEADER)); 934 if (!(pExec->pLXHeader)) 933 935 arc = ERROR_NOT_ENOUGH_MEMORY; 934 936 else 935 937 // read in LX header 936 938 if (!(arc = DosRead(hFile, 937 (*ppExec)->pLXHeader,939 pExec->pLXHeader, 938 940 sizeof(LXHEADER), 939 &( (*ppExec)->cbLXHeader))))940 if ( (*ppExec)->cbLXHeader == sizeof(LXHEADER))941 pbCheckOS = (PBYTE)(&( (*ppExec)->pLXHeader->usTargetOS));941 &(pExec->cbLXHeader)))) 942 if (pExec->cbLXHeader == sizeof(LXHEADER)) 943 pbCheckOS = (PBYTE)(&(pExec->pLXHeader->usTargetOS)); 942 944 } 943 945 else if (memcmp(achNewHeaderType, "PE", 2) == 0) 944 946 { 945 (*ppExec)->ulExeFormat = EXEFORMAT_PE;946 (*ppExec)->ulOS = EXEOS_WIN32;947 (*ppExec)->f32Bits = TRUE;947 pExec->ulExeFormat = EXEFORMAT_PE; 948 pExec->ulOS = EXEOS_WIN32; 949 pExec->f32Bits = TRUE; 948 950 949 951 // can't parse this yet … … 959 961 { 960 962 case NEOS_OS2: 961 (*ppExec)->ulOS = EXEOS_OS2;962 if ( (*ppExec)->ulExeFormat == EXEFORMAT_LX)963 (*ppExec)->f32Bits = TRUE;963 pExec->ulOS = EXEOS_OS2; 964 if (pExec->ulExeFormat == EXEFORMAT_LX) 965 pExec->f32Bits = TRUE; 964 966 break; 965 967 966 968 case NEOS_WIN16: 967 (*ppExec)->ulOS = EXEOS_WIN16;969 pExec->ulOS = EXEOS_WIN16; 968 970 break; 969 971 970 972 case NEOS_DOS4: 971 (*ppExec)->ulOS = EXEOS_DOS4;973 pExec->ulOS = EXEOS_DOS4; 972 974 break; 973 975 974 976 case NEOS_WIN386: 975 (*ppExec)->ulOS = EXEOS_WIN386;976 (*ppExec)->f32Bits = TRUE;977 pExec->ulOS = EXEOS_WIN386; 978 pExec->f32Bits = TRUE; 977 979 break; 978 980 } … … 981 983 } 982 984 } // end if (!(arc = DosSetFilePtr(hFile, 983 } // end if (*ppExec)->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER));985 } // end if pExec->pDosExeHeader = (PDOSEXEHEADER)malloc(sizeof(DOSEXEHEADER)); 984 986 985 987 // store exec's HFILE 986 (*ppExec)->hfExe = hFile;988 pExec->hfExe = hFile; 987 989 } // end if (!(arc = DosOpen((PSZ)pcszExecutable, 988 990 989 991 if (arc != NO_ERROR) 990 992 // error: clean up 991 doshExecClose(*ppExec); 993 doshExecClose(pExec); 994 else 995 *ppExec = pExec; 992 996 993 997 return (arc); … … 3005 3009 *@@added V0.9.0 [umoeller] 3006 3010 *@@changed V0.9.9 (2001-04-07) [umoeller]: added transparent LVM support; changed prototype 3007 *@@changed V0.9.9 (2001-04-07) [umoeller]: added memory leaks on errors3011 *@@changed V0.9.9 (2001-04-07) [umoeller]: fixed memory leaks on errors 3008 3012 */ 3009 3013
Note:
See TracChangeset
for help on using the changeset viewer.