Element MemoryStream GlobalConst implements_IStream ClassName Vars Self#.IStrm dd ? Self#.bPos dd ? Self#.ePos dd ? Self#.bufPtr dd ? Self#.bufSize dd ? GlobalProc proc ClassName#.IStream.Seek self,offset,origin push esi mov esi,[self] cmp byte [origin],2 jne @f mov eax,[pMemoryStream.ePos] add eax,[offset] jmp .ok1 @@:cmp byte [origin],1 jne @f mov eax,[pMemoryStream.bPos] add eax,[offset] jmp .ok1 @@:mov eax,[offset] .ok1: cmp eax,[pMemoryStream.ePos] jbe @f mov eax,[pMemoryStream.ePos] @@:mov [pMemoryStream.bPos],eax pop esi ret endp proc ClassName#.IStream.GetSize self push esi mov esi,[self] mov eax,[pMemoryStream.ePos] pop esi ret endp proc ClassName#.IStream.SetSize self,size push esi mov esi,[self] mov eax,[size] mov [pMemoryStream.ePos],eax cmp eax,[pMemoryStream.bufSize] jbe .exit and eax,-400h add eax,400h mov [pMemoryStream.bufSize],eax mov edx,eax mov eax,[pMemoryStream.bufPtr] call __realloc mov [pMemoryStream.bufPtr],eax .exit: pop esi ret endp proc ClassName#.IStream.Read self,buf,len push esi mov esi,[self] mov eax,[pMemoryStream.ePos] sub eax,[pMemoryStream.bPos] cmp eax,[len] jae @f mov [len],eax @@:mov edx,[pMemoryStream.bufPtr] add edx,[pMemoryStream.bPos] mov eax,[buf] mov ecx,[len] add [pMemoryStream.bPos],ecx call __memcpy pop esi ret endp proc ClassName#.IStream.Write self,buf,len push esi mov esi,[self] mov eax,[pMemoryStream.bPos] add eax,[len] cmp eax,[pMemoryStream.bufSize] jbe .ok and eax,-400h add eax,400h mov [pMemoryStream.bufSize],eax mov edx,eax mov eax,[pMemoryStream.bufPtr] call __realloc mov [pMemoryStream.bufPtr],eax .ok: mov eax,[pMemoryStream.bufPtr] add eax,[pMemoryStream.bPos] mov edx,[buf] mov ecx,[len] add [pMemoryStream.bPos],ecx call __memcpy mov eax,[pMemoryStream.bPos] cmp eax,[pMemoryStream.ePos] jbe .exit mov [pMemoryStream.ePos],eax .exit: pop esi ret endp proc ClassName#.IStream.Close self push esi mov esi,[self] xor eax,eax mov [pMemoryStream.bPos],eax mov [pMemoryStream.ePos],eax pop esi ret endp Create mov [Self#.IStrm],ClassName#.IStream xor eax,eax mov [Self#.bPos],eax if Self#.prop.Stream eq 0 mov [Self#.ePos],eax mov eax,400h mov [Self#.bufSize],eax call __alloc mov [Self#.bufPtr],eax else invoke FindResource,[hinstance],Self#.prop.Stream,100 push eax invoke SizeofResource,[hinstance],eax mov [Self#.bufSize],eax mov [Self#.ePos],eax call __alloc mov [Self#.bufPtr],eax pop eax invoke LoadResource,[hinstance],eax invoke LockResource,eax mov edx,eax mov eax,[Self#.bufPtr] mov ecx,[Self#.bufSize] call __memcpy end if PointWork doCopy EndPoint PointWork doClear xor eax,eax mov [Self#.bPos],eax mov [Self#.ePos],eax EndPoint PointWork doPosition \local pos ReadInt pos,data,data.type,Self#.Position,0 mov_ex eax,pos lea ecx,[Self#.IStrm] stdcall ClassName#.IStream.Seek,ecx,eax,0 EndPoint PointVar Stream,data_stream lea eax,[Self#.IStrm] result equ eax EndPoint PointVar Size,data_int result equ [Self#.ePos] EndPoint PointVar Position,data_int result equ [Self#.bPos] EndPoint EndElement