// СПОСОБ 1 >>
// mcppfaq_isManaged.cpp
// compile with: /clr
// arguments: mcppfaq_delnative.dll
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
static bool isManaged(String __gc* sFilename)
{
try
{
Byte Data __gc[] = new Byte __gc[4096];
FileInfo __gc* file = new FileInfo(sFilename);
Stream __gc* fin = file -> Open(FileMode::Open, FileAccess::Read);
Int32 iRead = fin -> Read(Data, 0, 4096);
fin -> Close();
// Verify this is a executable/dll
if ((Data[1] << 8 | Data[0]) != 0x5a4d)
return false;
// This will get the address for the WinNT header
Int32 iWinNTHdr = Data[63]<<24 | Data[62]<<16 | Data[61] << 8 | Data[60];
// Verify this is an NT address
if ((Data[iWinNTHdr+3] << 24 | Data[iWinNTHdr+2] << 16
| Data[iWinNTHdr+1] << 8
| Data[iWinNTHdr]) != 0x00004550)
return false;
Int32 iLightningAddr = iWinNTHdr + 24 + 208;
Int32 iSum=0;
Int32 iTop = iLightningAddr + 8;
for (int i = iLightningAddr; i < iTop; i++)
iSum|=Data[i];
if (iSum == 0)
return false;
else
return true;
}
catch(Exception __gc* e)
{
throw (e);
}
}
int main(int argc, char * argv[])
{
System::Console::WriteLine(isManaged(argv[1]));
}
// СПОСОБ 2 >>
static bool isManaged( String^ sFilename )
{
try
{
array<Byte>^ Data = gcnew array<Byte>(4096);
FileInfo^ file = gcnew FileInfo(sFilename);
if( !file->Exists )
{
return false;
}
Stream^ fin = file->Open( FileMode::Open, FileAccess::Read );
__int32 iRead = fin->Read(Data, 0, 4096);
fin->Close();
// Verify this is a executable/dll
if( (Data[1] << 8 | Data[0]) != 0x5a4d )
{
return false;
}
// This will get the address for the WinNT header
__int32 iWinNTHdr = Data[63]<<24 | Data[62]<<16 | Data[61] << 8 | Data[60];
// Verify this is an NT address
if ((Data[iWinNTHdr+3] << 24 | Data[iWinNTHdr+2] << 16
| Data[iWinNTHdr+1] << 8
| Data[iWinNTHdr]) != 0x00004550)
{
return false;
}
__int32 iLightningAddr = iWinNTHdr + 24 + 208;
__int32 iSum=0;
__int32 iTop = iLightningAddr + 8;
for (int i = iLightningAddr; i < iTop; i++)
{
iSum|=Data[i];
}
return (iSum == 0 ? false : true);
}catch(Exception^ e)
{
throw (e);
}
return false;
}