Re: .def file library name
"Newsgroupie" <buzbymb@yahoo.co.uk> ha scritto nel messaggio
news:4dac1de3-22e6-4be5-8246-d56a6ea545a6@x38g2000yqj.googlegroups.com...
As a follow up to this topic, would it be possible to locate and parse
the list of a DLL's required DLL's?
You can find a new updated version of the source code here:
http://www.geocities.com/giovanni.dicanio/vc/TestDllInspector.zip
and the compiled exe here:
http://www.geocities.com/giovanni.dicanio/vc/TestDllInspector_exe.zip
A sample output is like this:
<output>
Internal DLL name is: TestMyDll.dll
This DLL requires:
#1 USER32.dll
#2 MSVCR90D.dll
#3 KERNEL32.dll
#4 ADVAPI32.dll
</output>
On a simple test, I verified that I get the same results of DUMPBIN.
I defined a new function DllInspector::GetDllDependencies(), that you can
use like this:
<code>
// Get list of DLL imports
std::vector< CStringA > dependDlls;
result = DllInspector::GetDllDependencies( dllFilename, dependDlls );
if ( result == DllInspector::Success )
{
printf("This DLL requires:\n");
for ( size_t i = 0; i < dependDlls.size(); i++ )
{
printf("#%d %s\n", (i+1), dependDlls[i].GetString());
}
}
else
{
printf("Error %d\n", result);
}
</code>
The implementation of the aforementioned function follows (with a structure
very similar to the other function to get the "internal" DLL name):
<code>
//========================================================================
// Call this function to get the names of the DLL's imported by the
// input DLL (given its filename).
//========================================================================
ErrorCodes GetDllDependencies(
IN LPCTSTR dllFileName,
OUT std::vector< CStringA > & importList
)
{
// Clear output argument
importList.clear();
// Access the DLL
DllLoader dllLoader( dllFileName );
// NOTE:
// If the DLL was already loaded in the process, the DllLoader instance
// can be substituted with a simple call to GetModuleHandle(
dllFileName ), e.g.:
//
// HINSTANCE hInstance = GetModuleHandle( dllFileName );
//
HINSTANCE hInstance = dllLoader.GetHInstance();
if ( hInstance == NULL )
{
return Error_CantLoadModule;
}
// Check DOS signature
IMAGE_DOS_HEADER * dosHeader = reinterpret_cast< IMAGE_DOS_HEADER * >(
hInstance );
if ( dosHeader->e_magic != IMAGE_DOS_SIGNATURE )
{
return Error_BadDosSignature;
}
// Get pointer to main PE header
IMAGE_NT_HEADERS * ntHeaders = reinterpret_cast< IMAGE_NT_HEADERS * >(
((BYTE *)dosHeader) + dosHeader->e_lfanew );
// Check the signature:
// the signature field viewed as text is "PE\0\0"
if ( ntHeaders->Signature != 0x00004550 )
{
return Error_BadPeSignature;
}
// Navigate until we find the RVA of DLL Name in IMAGE_IMPORT_DIRECTORY
structure
IMAGE_OPTIONAL_HEADER * optionalHeader = &ntHeaders->OptionalHeader;
IMAGE_DATA_DIRECTORY * dataDirectory = &optionalHeader->DataDirectory[
IMAGE_DIRECTORY_ENTRY_IMPORT ];
IMAGE_IMPORT_DESCRIPTOR * importDescr = reinterpret_cast<
IMAGE_IMPORT_DESCRIPTOR * >(
(DWORD)dosHeader + dataDirectory->VirtualAddress);
// Last import descriptor is characterized by all 0s (NULLs)
IMAGE_IMPORT_DESCRIPTOR lastImportDescr;
ZeroMemory(&lastImportDescr, sizeof(lastImportDescr));
bool lastImportDescrFound = false;
while ( !lastImportDescrFound )
{
// Check in case we find the last import descriptor
if ( memcmp( importDescr, &lastImportDescr,
sizeof(lastImportDescr) ) == 0 )
{
// Found the last import descriptor
lastImportDescrFound = true;
}
else
{
// Access the ASCIIZ string of DLL name using the RVA
const char * pszDllName = reinterpret_cast< const char * >(
((BYTE *)hInstance) + importDescr->Name );
// Store the import DLL name in the output parameter
importList.push_back( pszDllName );
// Update import descriptor to next one
importDescr++;
}
}
// All right
return Success;
}
</code>
IMHO, I encourage you to try to write the code yourself, to better
understand the techniques used.
HTH,
Giovanni
begin 666 TestDllInspector.zip
M4$L#!!0````(`(V"@SF+3Y92&0<``*L:```A````5&5S=$1L;$EN<W!E8W1O
M<B]$;&Q);G-P96-T;W(N8W!P[5AM;^+&%OX>*?_A;*ZT-5D":/N>;%!9(!M+
M!!"P;;>W%1KL`49KCRW/."^[2G][S_'89@PDC=K<+U<[D1+BF3DOSWE[3+/Y
M7.OPH-F$"W?0/X5>$+A2Q=S34=+PXIBVLNW%';P3T3634D!/>$R*"-ZLRB>C
M&?CYTY]@%3(19,^\*&R7(EZW6C_4H<<]'BYX`E\G?KG5XTLAN8)E*CTM(JE
M1Y!PG0A^S:$W&,"1D)HGD@5'X#/-ZK 2UUQF6TL1<,E"WBC$92*'HUG_M/QO
MMA8*K?$YX-\%4]R'2(*0RR@)&6E$;<R'91*%<,6TAK% [?SC5PI8HH47\$P6
M'(TY3X1<`:(D4)I><Q@C;AV816D"T3)[\HN07[^&<91HM@@X]&^YEYJ/%X)^
M94J/,H%KK>/39C-4OFR$PDLB%2UU`W%K<GF2JF;(5NP38H,G?FC]^/UWKQM,
MQ;>%7\^U#@_HYS]">D&*7AU-M=]9WC;61V O-'><\!,T+D8W?%@C9#Q1]L5*
M_I37\>)5Y*?HNKEBU!T>4-14S#Q>R;O#@\]FN]D\?Z:503WIN"[<)"R.,?LP
MOP81\P=BD;#DKGF1<)Y_?EZ]7L"4(O=(&S>^Q>DB$-XIN9BC0YN*DKE1/G*7
M\([K2T1%,^EQIT;UD"98&L/W@T$=A(:0,ZJ4-=-9'00HA%)SR2@ZN21^&Z,N
M/%R:X,!@W)U-9Q/P@^ BKQVHF>.?S1]:X7R-=^#<QLFIWCDSI^\M3[H!&I7&
MRCSX<Z-U5X%8@E-H>7&>N568L762EA6A\E9A0+%*DTF6M7>_:^?$`I-:`4^2
M* &'-U8-[!-IX(.,= 8I85NKEQ=YH#A=4*GG<0QM$16J^X2K--#4!2S,\D!<
MNL/IK#/L]K?"N@.+$9C[8B.,B9.(:Z:I%95>[%%8!_2DXM>V!:7L#2"ER+>=
M(71'XP^;C:I6*X\\;-168L'+,B#VLPC+C6%9GS]TX?ZLZ ?/7/ 7^32A8E]Q
MG87(FB-4,Y3'Q2RA[9UY\O>JGK8.#_H4B2Z.($49X.9F(!A#U.48W-SA=G$.
M,P/-[NC]#+I33?.G@]CYU#.-E&%>PI\K=8CS*-5QJG&$K=*02VUVM^XU^F&L
M[YS:F54='9/;.2+;,?4W*6!9"14)^?C-_W.7);HW#$=J0-/V+BLOG"/"8!\G
M$6FMFZ.E-I&72BD,:08L.!;@0FFA4XT2;H1>`P,EPAB'C,>P"6#,$68S=BZ9
M] .^96T=J-A+&TOQ=J&LBSK%GO*XM+.JG/TB2N :U1Z07\X:HG6^VA-W6T26
M4?,NDYJD&N/VM>0U]SXB'9LB/BO)\&J.I7O5>=>?X\;\LM_I]2=P#'ZD+K,1
MC=8F/*N5&+7-/:;TFWT7VK;%%4=*42=M/D<:(SSJ\AL14_?=L#-[/^G_G8-O
MF=^+U+2P?8^'B";$468MQ1WIIT165I*-C:_#66[Y%$V7VMBG'O&U<@%]=9RW
M'V9].*Z5WM7@5=758,DDO[$R(@\`9749@$UI5!YC[^$X>JX%O\&LQDK1_%83
M93T:]W]O_=XZLO MS3]IE]@0PJW;%JYOOOVV]01@Q_PQ7(?L6JRP]4,J-3+Z
M&[)/^IG)DY\[-':HHK,"0,0-8OU?QZ/);-YS)_WN;#3Y`$HGJ;>==*/QS!T-
M.X--(D4QM6H6E.GWTG)P5-D\JZ1O9]:QM!UGKP<]D614\H[D5"6?M'OV@?\6
M8@H)\_YP1K\S-^"/BJX=WXZ)7]G*'LJC/3?;SB8L3N^7T:2W22K**=O*D_;/
M(M$I"SJ^CR1#/=2L.].NZ_Y&D!,1S..3<;54T9,\<N:JF<;>&N?$,<3J4SZ*
M]GI1.6O705G\5 <V&"?MW:$PQ0WSSE1,X8V!^1#()U;,$GRHB^K='G7GY1QT
M;,NKL. 02,1JG4^]//.GAK81[2A8Q[/SCFXV?^B-<[F'@60O/<6;(KJ/KY@X
MMO!=$2L>W[+I:29%2 *"\'$,/Q%:E=RD]C\E)XAGC\=<^EQZ@JO'R8G9)&ZB
MM']Z>IV%_\V&J+21JA@'!P)S*#O^5*JRN=?PZ)09E5^(RA>B\H6H?"$J_XZH
MN%?_%T3%N+%%5 K?^M/NQ!WC:51G>FF/*^^QFMEW\]F8R@`5Y7: 3X:(&.]0
MVA"S8!X:)#Z9,4B=L:7 H<:B:H_[%J!8=^-=CL1O/(FN>(@V.2^W3M0QD3_Q
M:.EL/:]MK%U$4; M^")*,:G.8<D"563AS9J^T77@Q=ZSNWE=5AGF(>+.*[D:
M[,5G<]E\8\9#+XP=.YYU>+*'4*-V75;<EG6YA<;XIUA$ZP&4L)H*D&C=;S[2
M5VB/J?^GA+98ST]L+:QW>*UEN,5O#61/8[?%LMA.G*KU?,&\CP_P6TOI^]BG
MSK=;5CA@)'7E2/)]>C)O7KW:#9'=6)](HN_I[$/?YA\>_ 502P,$% ````@`
M4("#.;&5ISE"`@``D@8``!\```!497-T1&QL26YS<&5C=&]R+T1L;$EN<W!E
M8W1O<BYHU53!:MM $+T;_ ]#"HT-KNVVEV*GH:EE!U'7-K%[Z:6LM2-E0-H5
MNRN'4/+OG5TI<E)(3J;0T6W>[-N=>4\S&ITJNIW1"!;Q<CZ!*,]C94M,G#;#
M6P\$<'\/UZ0/0BF"B!*A2,-%UF;6.Y!-]@MDA: \Y!)=7+84'\;C3P.(,,%B
MCP8^&ME"$::DT$):J<215A:<!H/.$!X0HN42SD@Y-$KD9R"%$P/(Z( J0"GE
MJ$2!PT>Z4T6WX[\WI1'<$6B58)WQE]E2)/AL6-W.[VX'557 W!AM9EJB#3G@
MV%9)@M;"9Q@/H GN>UVB$;YAN!,6;%V45KF_I2E9\"PK@W929P+WKY7FFQ=-
MWUN^GU)"R>SO!T_+9D*YI1;RNY95CL^@KT)&VFXI4\(Q_=_8!ENHVWF8^O>,
M1N].%$'RF<AS<+=T%-UKGJ'C)#Z5VTOLVP0_(9XS]TG*DL10&+@V<TBU*80+
M%H"5=AX4-55[GMKSS'2UG<7Q3TX84EE][ :Y7;;>>2/6.?1HB$,8]X%28".:
M>WZORB#3;-7UMP%@;OE9"M"/C<TNF_<P?VIT`6*OV;[>$\/3SN_H,+A&%S>S
M8D^LN-%>K66\@N5FMMON;D#69O'@`&IT_6,'LVWH_@K>^HI'%E_%1?UI;?9_
M*GOXLT"G7C0+5)3:.-:+EX]'2965"WH&JEZ]`LC9=@7T7S. !6'P)0O8_]P#
MK'V$)2J)*B&TKWO@: 'KY&1R"/OKXNB'2W9$/?PE6=>:X6'J%])+V\]_?P!0
M2P,$"@``````VJ.".?Q)W%<5````%0```!L```!497-T1&QL26YS<&5C=&]R
M+U-T9$%F>"YC<' C:6YC;'5D92 B4W1D069X+F@B#0I02P,$% ````@`PX"#
M.7VGS0TX````5 ```!D```!497-T1&QL26YS<&5C=&]R+U-T9$%F>"YH4RXH
M2DS/353(STM.Y>7BY5+.S$O.*4U)5;!)+,E)2BQ.U<NP0Q,M+BD""R(+EZ4F
ME^07@05YN0!02P,$% ````@`>8.#.7T8/2FI`@``-P<``"4```!497-T1&QL
M26YS<&5C=&]R+U1E<W1$;&Q);G-P96-T;W(N8W!PK51-;]I $+TC\1^F1)$,
M04#22T4(:A1(A)0T$=!3@BK''L.J]MK=74<A5?Y[9_R5Q4W:"^N#\<SL>S/O
M[=+O[VLU&_T^+%&;21C.I$[0,['J>4G"B2SYN(4K$3^Y4@J8",^5(H;1NHK<
M+L$OHE]A';DBS&)>'(TKB)/!X$L7)NAA](@*/BN_2LU3"68C-"0J7BLW@D#%
M$460$2)7^A *B5U(7*V%7&>90(0HW0@A#O@[PYE<7X.)H27R&5J]DF%?J]G@
MYT!(+TQ]A-;"^.?!<V_3LH,[(G**GV+23J<#B]G-W?44EM/%DK_SG) &2#?I
M\ ]7K;TN>!M708<_GNY7[6;C=[,!M!)%)8'38BCV#&P^!GR0K?;I;NT[]CW(
MHBZOI-XN-NC]W%$<G%QI12P<BV6XY7[2"*E+\HO3A>BN=,/M"[9S.!& DXT!
MG\[@!(IH,8'=V7@\ANE\?CL?@MY*XSX3[-":P*X%.-0P\L.P,G],E=U<H<'*
MWH+/PCC'9>35FO(RI?V):S9\<(K>#<F8%UPLC.(31B27!8>3XQ^O8$>M90R/
M" I-JB3Z?$%L'X;#*S0S:5"1+)3X1D [#.=,419PUL:FO2"*7-:CK+;ODDR5
MBM5%[*.F3G0:&CC[;QO.FTK6E-UZ/U"*EUE9HM?A%ZGGH=;_,'A6GX,-)B,S
MYVJ</>HVE\=I6][Q"T.-'W)D,L"AGV'FK?YE?5E;/_6L=2CH@!?'041)K(S.
M\]KXP^%3-NOHS;DQ^)B@]$D*7=!\K#X%)EDU2D^@=FJB5T#[TGO)_Z,\B,)?
MJ2"<^FT*2"H'M'C!'W3*J.7!*;U&5BL]3CIM"A\=E4PU-IOQX-"'TE!''!VW
M[;'NQ>H]5WF][L]@\I&6WFJ#D=.Z._^^F%8SYU>4IFPVLMH_4$L#!!0````(
M``BD@CDEGIJ@<00``((0```H````5&5S=$1L;$EN<W!E8W1O<B]497-T1&QL
M26YS<&5C=&]R+G9C<')O:NU866_;1A!^5H#\!X/(0X*4%@^=6*D!#]$5*A^P
M?/2A0+ B1]+:Y"Z[)&6Y;?Y[AX>LHU:LN.A#@ "FP)V=;V;GV]F/I'N?EE%X
MM "9,,'[BGZL*4? ?1$P/NLKMXP'XB%1=:-I*)]^?ONF=\.2C(;C- N8N)#B
M#OST[9M:=7?U&$-?*5V.G(\?%9RZ687N_J1IN>&,1NAT!4GJAN&0)S$"A536
M44ZNAVY?^<MSC(;EMMJJ9C8MM:'IAMII:%U5;PV<9E=O-@=.]TL.NQ0BS8,F
M,?7W1/X5'A^$#(J"3"//DUNOJ)Q!ZDG$XNS]TTKU;JNEF[D'5ESK780TG0H9
M)?EH/<P'53%%U-R_5B\0]2U([TJ(T&,AE*/Z]M 1?,IFF:0IYJY2;-DV\K@P
MR69_K[/5SK,TSE*7R:+2Q[[R[OU8A%D.0^.'=^^W(N5!/I3 (4]!1A PFL(6
M?!]@RU[NLU[-S*FD/H8;0_ID+.HH*R_NJ@)NG L)=L;"8+ `GN;3I7]]+\#)
MDE1$!>80]]].1RY-Z0EPP+4*>0CF%B9CD OF`W;&\O&;L*=#=W10&2-'1#'N
M^D;4VGF<LHC]67#:5[3*BA3%4OB0)$*Z,&6<%:V!;38\,PWRV1W8UR?DLW-^
M-CX?#2K0*;I%-+S$#D&F^DHJ,ZBF;)HP_S+CF N<.?CW&,JLYBKSB$TDS1M@
M9;].D OPRR4'OP`-0#YM;NV62H[Z,((%A&M,T9U#GO=]49%7W/25QHL<4DYG
M$%Q"(C+IP[^)V@]]#08+&S%^?W 'YLY;VY8;AMR7$&$$B@Q4I[%6=0[L,K&U
M'>-L,GY,4HC6?)9"=$K].>/K@[5_15:^@H.ZDW(V13T\Z.2XZ'X/A[C:B7^H
MJ[=T1'R(HQ7'*,!LR@[<1)&D^X6D5]_2JZ^KZB6$0!/X+G3U=B["7*5F^-#:
M5H\?PKNGC)>%=W5\!YQ.0L ME(RC9'H9]ROEW3B^+ZCSV;/JO"NSVQE7B0H]
MS8]V\>ZUD?-Y-5X]+[Y-C<T#-./[5N.5JKY6C:OF@$N8@L1W84AV-\PY/W6M
M*T^$Y5OR:O*'C/__,KYC*M^AUSM5NNR,GUZVBUM4U")%N81QT;!'A4N9NG3I
M*WX<$Y_X^+=<D@"F1 0A87C-XSLRH2FA291?RQ)VS=D?&0P#+*.H'K]@&I[3
M-MN>KCIMJZDVS'9+M;162S4LTW#;3<,R/.]+B:X(RI=1$H0/)2QP`1<TG?>5
MX]\WOVB.<6E5RU6X>@Y\,<8X#:SI\K7HW>^JK\4I;I'%/:27"O8<Z7-D-R9S
M9'P>$<:1<.Z391+LY;AK=KM-LZ.IG:[MJHV)UE [G8&MMHRF9P^:QL#V[%=Q
M//\/#._%OL#+2C^?8T;ZA/F"^)DDDR@F03@CTC?P2LF$<2)G"9FQ*;F+9WA!
M\4,D)$N"5$WS'Q+S&7F@B[U4MMJNU;+LENIU-$UM^%I'[=AM2^V8MJT;NF6Y
MFKY)Y68Q98WE<3L)Q82&U5%<#WKU9_YW@/9_`%!+`P0*``````"9@X,Y````
M````````````$0```%1E<W1$;&Q);G-P96-T;W(O4$L!`A0`% ````@`C8*#
M.8M/EE(9!P``JQH``"$``````````0`@`+:!`````%1E<W1$;&Q);G-P96-T
M;W(O1&QL26YS<&5C=&]R+F-P<%!+`0(4`!0````(`%" @SFQE:<Y0@(``)(&
M```?``````````$`( "V@5@'``!497-T1&QL26YS<&5C=&]R+T1L;$EN<W!E
M8W1O<BYH4$L!`A0`"@``````VJ.".?Q)W%<5````%0```!L``````````0`@
M`+:!UPD``%1E<W1$;&Q);G-P96-T;W(O4W1D069X+F-P<%!+`0(4`!0````(
M`,. @SE]I\T-. ```%0````9``````````$`( "V@24*``!497-T1&QL26YS
M<&5C=&]R+U-T9$%F>"YH4$L!`A0`% ````@`>8.#.7T8/2FI`@``-P<``"4`
M`````````0`@`+:!E H``%1E<W1$;&Q);G-P96-T;W(O5&5S=$1L;$EN<W!E
M8W1O<BYC<'!02P$"% `4````" `(I((Y)9Z:H'$$``""$ ``* `````````!
M`" `MH& #0``5&5S=$1L;$EN<W!E8W1O<B]497-T1&QL26YS<&5C=&]R+G9C
M<')O:E!+`0(4``H``````)F#@SD````````````````1````````````$ #_
L03<2``!497-T1&QL26YS<&5C=&]R+U!+!08`````!P`'`!0"``!F$@``````
`
end