I'm looking into a problem that causes Supreme Commander to segfault (Bug #7643) and I believe I may have run into a problem with IWineD3DSurfaceImpl_LockRect.  I believe the problem is a typo in the line:
This->resource.allocatedMemory = HeapAlloc(GetProcessHeap() ,0 , This->resource.size + 4);

I think that the allocated memory should be the size of the resource multiplied by 4 (instead of adding 4).  With the current allocation, for some textures, the operation to calculate the pBits location returns a memory address that is past the end of the allocated memory. So, after this operation:
pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top) + (pRect->left * This->bytesPerPixel)
the value of pLockedRect->pBits is greater than "This->resource.allocatedMemory + This->resource.size + 4".

I've dug around a bit to see if This->resource.size was just allocated incorrectly but that does not appear the case.  So, if someone could confirm or deny that this is a typo problem then I'd really appreciate it.

Erich Hoover
ehoover@mines.edu