internal static List <T> ReadShortIDList <T>(IntPtr pointer, Func <ushort, T> createFunc, bool free = true) { if (pointer == IntPtr.Zero) { return(null); } const int sizeOfItem = 2; List <T> result = new List <T>(); for (int offset = 0; ; offset += sizeOfItem) { ushort id = (ushort)Marshal.ReadInt16(pointer, offset); if (id == 0) { break; } result.Add(createFunc(id)); } if (free) { Functions.freeMemory(pointer); } return(result); }