home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / C++-7 / DISK10 / MFC / SRC / VALIDADD.CP$ / validadd
Encoding:
Text File  |  1992-01-18  |  3.7 KB  |  145 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and Microsoft
  7. // QuickHelp documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. #include "afx.h"
  12. #ifdef _WINDOWS
  13. #include "afxwin.h"
  14. #endif
  15. #pragma hdrstop
  16.  
  17. #ifdef AFX_CORE_SEG
  18. #pragma code_seg(AFX_CORE_SEG)
  19. #endif
  20.  
  21. #pragma optimize("qgel", off)
  22. #pragma warning(disable:4100)
  23.  
  24. extern "C" BOOL FAR PASCAL
  25. AfxIsValidAddress(const void FAR* lp, UINT nBytes, BOOL bReadWrite /* = TRUE */)
  26. {
  27.     BOOL bValid = FALSE;
  28.     
  29. #ifdef _WINDOWS
  30.     BOOL b286 = (WF_CPU286 & GetWinFlags()) ? TRUE : FALSE;
  31.     
  32. if ( !b286 )
  33. {
  34.         
  35.     _asm {
  36.             _asm _emit  0x66
  37.             xor     bx, bx                  ; clear out ebx
  38.             mov     bx, WORD PTR lp + 2
  39.             or      bx,bx
  40.             jz      done                    ; zero segments are always bad
  41.             _asm _emit 0x0F                 ; lar cx, bx
  42.             _asm _emit 0x02
  43.             _asm _emit 0xCB                     
  44.             jnz     done
  45.  
  46.             test    ch,128                  ; if (!present(bx))
  47.             jz      skip_range_test         ;   return fTrue;
  48.  
  49.             cmp     bReadWrite, 0
  50.             je      skip_write_test
  51.  
  52.             _asm _emit 0x0F                 ; verw bx
  53.             _asm _emit 0x00
  54.             _asm _emit 0xEB
  55.                                             ; if (!writeable(bx))
  56.             jnz     done
  57.  
  58.     skip_write_test:
  59.  
  60.             _asm _emit  0x66
  61.             _asm _emit  0x0F                ; lsl, edx, bx
  62.             _asm _emit  0x03
  63.             _asm _emit  0xD3
  64.             jnz     done
  65.                                             ;* dx = last valid address
  66.  
  67.             mov     bx, WORD PTR lp
  68.             mov     cx, nBytes
  69.             jcxz    skip_range_test         ; if length == 0, ignore offset part
  70.  
  71.             ;* make sure start address is valid
  72.             _asm _emit  0x66
  73.             cmp     bx,dx                   ;  if (offsetof(lp) > dx)
  74.             ja      done
  75.  
  76.             ;* make sure last address is also valid
  77.             dec     cx                      ; bias for last byte
  78.             add     bx,cx
  79.             jc      done                    ; overflow => no good
  80.             _asm _emit  0x66
  81.             cmp     dx,bx                   ;  if (offsetof(lp) + nBytes <= dx)
  82.             jb      done
  83.     skip_range_test:
  84.             inc     bValid
  85.     done:
  86.     }
  87. }
  88. else
  89. #endif  // !_WINDOWS
  90.     _asm {
  91.             mov     bx, WORD PTR lp + 2
  92.             or      bx,bx
  93.             jz      done2                   ; zero segments are always bad
  94. #ifndef _DOS
  95.             _asm _emit 0x0F                 ; lar cx, bx
  96.             _asm _emit 0x02
  97.             _asm _emit 0xCB                     
  98.             jnz     done2
  99.  
  100.             test    ch,128                  ; if (!present(bx))
  101.             jz      skip_range_test2        ;   return fTrue;
  102.  
  103.             cmp     bReadWrite, 0
  104.             je      skip_write_test2
  105.  
  106.             _asm _emit 0x0F                 ; verw bx
  107.             _asm _emit 0x00
  108.             _asm _emit 0xEB
  109.                                             ; if (!writeable(bx))
  110.             jnz     done2
  111.  
  112.     skip_write_test2:
  113.  
  114.             _asm _emit  0x0F                ; lsl, dx, bx
  115.             _asm _emit  0x03
  116.             _asm _emit  0xD3
  117.             jnz     done2
  118.                                             ;* dx = last valid address
  119.  
  120.             mov     bx, WORD PTR lp
  121.             mov     cx, nBytes
  122.             jcxz    skip_range_test2            ; if length == 0, ignore offset part
  123.  
  124.             ;* make sure start address is valid
  125.             cmp     bx,dx                   ; if (offsetof(lp) > dx)
  126.             ja      done2
  127.  
  128.             ;* make sure last address is also valid
  129.             dec     cx                      ; bias for last byte
  130.             add     bx,cx
  131.             jc      done2                   ; overflow => no good
  132.             cmp     dx,bx                   ; if (offsetof(lp) + nBytes <= dx)
  133.             jb      done2
  134.     skip_range_test2:
  135.  
  136. #endif //!_DOS
  137.             inc     bValid
  138.     done2:
  139.     }
  140.     return bValid;
  141. }
  142.  
  143. #pragma warning(default:4100)
  144. #pragma optimize("", on)
  145.