@echo OFF REM MemBlock - Examples CEnvi DOS program to walk through the list of REM allocated memory. This uses interrupts through the interrup() REM function, and direct memory access using peekbuf(). ECHO The following is a walk-through of your allocated memory blocks: cenvi %0.bat GOTO CENVI_EXIT #define MCB_HEADER_SIZE 16 #define ID_OFFSET 0 #define MORE_TO_FOLLOW 'M' // set if more MCB follow in chain #define LAST_MCB 'Z' // if no more MCB in chain #define PSP_SEG_OFFSET 1 #define SIZE_OFFSET 3 #define ENVIRONMENT_SEG_OFFSET 0x2C /*************************************************************/ /* Get access to the first memory block through undocumented */ /* DOS interrupt to get the DIB (Dos Information Block. */ /*************************************************************/ reg.ah = 0x52 // Get DIB address in ES:BX interrupt(0x21,reg) // The actual first mcb (memory control block) address is 4 bytes below // es:bx, or 16 bytes above the previous paragraph segment = PeekWord(reg.es - 1,reg.bx+14) /*************************************************************/ /* Loop through all MCB's, displaying information about them */ /*************************************************************/ count = 0 total = 0 do { printf("==========================================\n") id = peek(Address(segment,ID_OFFSET)) printf("MCB number\t= %d\n",++count) printf("ID\t\t= %c\n",id) printf("MCB address\t= %04X:0000\n",segment) printf("Memory address\t= %04X:0000\n",MemorySeg = segment+1) printf("PSP address\t= %04X:0000\n",PspSeg = PeekWord(segment,PSP_SEG_OFFSET)) size = PeekWord(segment,SIZE_OFFSET) printf("Size\t\t= %d paragraphs (%d bytes)\n",size,size*16) if ( 0 != PSPSeg ) { EnvironmentBlock = PeekWord(PspSeg,ENVIRONMENT_SEG_OFFSET) if EnvironmentBlock == MemorySeg ShowEnvironmentBlock(EnvironmentBlock) } // increment segment to point to the next MCB segment += size + 1 total += size + 1 } while( id == MORE_TO_FOLLOW ) /***************/ /* SHOW TOTALS */ /***************/ printf("==========================================\n") printf("Totals:\n") printf("MCB Count\t= %d\n",count) printf("Memory\t\t= %d paragraphs (%d bytes)\n",total,total*16) /*****************************************/ /* FUNCTION TO DISPLAY ENVIRONMENT BLOCK */ /*****************************************/ ShowEnvironmentBlock(seg) { printf("Environment block at %04X:0000\n",seg) for ( Offset = 0; 0 != peek(Address(seg,Offset)); Offset++ ) { EString = peek(Address(seg,Offset),1000) Offset += strlen(EString) printf(" %s\n",EString) } printf("Program: ") if ( 0x0001 == PeekWord(seg,++Offset) ) { // the full path and name of the calling program follows printf("%s\n",peek(Address(seg,Offset+2),1000)) } else printf("Unknown\n") } /***********************************************/ /* UTILITY FUNCTIONS USED IN THE ABOVE PROGRAM */ /***********************************************/ PeekWord(segment,offset) { return( peek(Address(segment,offset),UWORD16) ); } :CENVI_EXIT