/// <summary>Get array of delay import modules and procedures</summary> /// <returns>Delay import modules</returns> public IEnumerator <DelayImportModule> GetEnumerator() { if (!IsEmpty) { UInt32 sizeOfDescr = (UInt32)Marshal.SizeOf(typeof(WinNT.ImgDelayDescr)); UInt32 count = (base.Directory.Size / sizeOfDescr) - 1; //Значение чисто абстрактное, т.к. Delphi пишет в последнюю структуру одни нули. А в count указывает левое значение (только Delphi). UInt32 position = base.Directory.VirtualAddress; for (UInt32 loop = 0; loop < count; loop++) { //UInt32 position = base.Directory.VirtualAddress + sizeOfDescr * loop; WinNT.ImgDelayDescr descriptor = base.Parent.Header.PtrToStructure <WinNT.ImgDelayDescr>(position); position += sizeOfDescr; if (descriptor.IsEmpty) { yield break; //Delphi заканчивает блок не кол-вом элементов, а структурой с нулевыми данными } yield return(new DelayImportModule(this, descriptor)); } } }
/// <summary>Create instance of delay import module description class</summary> /// <param name="directory">PE directory</param> /// <param name="descriptor">Base info</param> public DelayImportModule(DelayImport directory, WinNT.ImgDelayDescr descriptor) { this._directory = directory; this._descriptor = descriptor; }