Blockbegin.Y
Blockend.Y
are what you are looking for. Blockbegin is always the lower line number (or lower X, if the selection has one line only). They are sorted, if the selection was done "backward" (eg with shift cursor-up)
If Blockend.X=1, then you want to reduce BlockEnd.Y by 1. Because there are 0 chars selected in the last line. It simply means that the whole line above is selected (including carriage-return).
You may want to check SelectionMode too, if block or line mode selection need different treatment.