⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory.c

📁 SimpleGraphicOperatingSystem 32位图形化操作系统 多进程 支持FAT32 详见www.sgos.net.cn
💻 C
字号:

#include <api.h>
#include <stdio.h>
#include <windows.h>

//创建堆
/* flOptions:
HEAP_CREATE_ENABLE_EXECUTE 0x00040000
HEAP_GENERATE_EXCEPTIONS 0x00000004
HEAP_NO_SERIALIZE 0x00000001
*/
HANDLE WINAPI HeapCreate(
  DWORD flOptions,
  SIZE dwInitialSize,   
  SIZE dwMaximumSize    
){
    printf("HeapCreate: 0x%X, 0x%X, 0x%X \n", flOptions, dwInitialSize, dwMaximumSize );
    return (HANDLE)0x10000000;
} 

//Copy memory
void WINAPI CopyMemory(
  PVOID Destination,
  const VOID* Source,
  SIZE Length
){
    memcpy( Destination, Source, Length );
    printf("CopyMemory 0x%X, 0x%X, %d\n", Destination, Source, Length );
}


//
HANDLE WINAPI GetProcessHeap(void)
{
    printf("GetProcessHeap\n" );
    return (HANDLE)0x10000000;
}

//HeapAlloc
#define HEAP_ZERO_MEMORY 0x8
LPVOID WINAPI HeapAlloc(
  HANDLE hHeap,
  DWORD dwFlags,
  SIZE dwBytes
){
    printf("HeapAlloc 0x%X, 0x%X, %d\n", hHeap, dwFlags, dwBytes );
    PVOID mem = KVirtualAlloc( -1, dwBytes, 0, 0 );
    if( dwFlags&0x8 )
        memset( mem, 0, dwBytes );
    return mem;
}

//改变一个Heap的大小
SIZE WINAPI HeapCompact(
  HANDLE hHeap,
  DWORD dwFlags
){
    printf("HeapCompact 0x%X, 0x%X\n", hHeap, dwFlags );
    return 0;   //failed!!
}

//释放一个堆
BOOL WINAPI HeapDestroy(
  HANDLE hHeap
){
    printf("HeapDestroy 0x%X\n", hHeap );
    return FALSE;   //failed
}


//释放从堆申请的内存
BOOL WINAPI HeapFree(
  HANDLE hHeap,
  DWORD dwFlags,
  LPVOID lpMem
){
    printf("HeapFree 0x%X, 0x%X, 0x%X\n", hHeap, dwFlags, lpMem );
    if( hHeap==NULL )
        return FALSE;
    KVirtualFree( lpMem, 0, 0 );
    return TRUE;
}

//把已经从堆中分配的内存重新分配大小
LPVOID WINAPI HeapReAlloc(
  HANDLE hHeap,
  DWORD dwFlags,
  LPVOID lpMem,
  SIZE dwBytes
){
    printf("HeapReAlloc 0x%X, 0x%X, 0x%X, %d\n", hHeap, dwFlags, lpMem, dwBytes );
    KVirtualFree( lpMem, 0, 0 );
    PVOID mem = KVirtualAlloc( 0, dwBytes, 0, 0 );
    if( dwFlags&0x8 )
        memset( mem, 0, dwBytes );
    return mem;
}


//由指针获得一个内存块的大小
//暂时SGOS内核没有提供这种系统调用
SIZE WINAPI HeapSize(
  HANDLE hHeap,
  DWORD dwFlags,
  LPCVOID lpMem
){
    printf("HeapSize 0x%X, 0x%X, 0x%X\n", hHeap, dwFlags, lpMem );
    return 0x40000000;  //we have much memory to use
}

//不了解该函数用途
BOOL WINAPI HeapValidate(
  HANDLE hHeap,
  DWORD dwFlags,
  LPCVOID lpMem
){
    printf("HeapValidate 0x%X, 0x%X, 0x%X\n", hHeap, dwFlags, lpMem );
    return TRUE;
}

//获得一个Heap的信息
BOOL WINAPI HeapWalk(
  HANDLE hHeap,
  LPPROCESS_HEAP_ENTRY lpEntry
){
    printf("HeapWalk 0x%X\n", hHeap );
    return FALSE;
}

//申请某一虚拟地址上的内存
LPVOID WINAPI VirtualAlloc(
  LPVOID lpAddress, 
  DWORD dwSize, 
  DWORD flAllocationType, 
  DWORD flProtect 
){
    printf("VirtualAlloc 0x%X, %d, 0x%X, 0x%X\n", lpAddress, dwSize, flAllocationType, flProtect );
    LPVOID addr = KVirtualAlloc( lpAddress, dwSize, flAllocationType, flProtect );
    //printf("Alloc Memory Address: 0x%X\n", addr );
    return addr;
}

//释放某一地址上的内存
BOOL WINAPI VirtualFree(
  LPVOID lpAddress, 
  DWORD dwSize, 
  DWORD dwFreeType 
){
    printf("VirtualFree 0x%X, %d, 0x%X\n", lpAddress, dwSize, dwFreeType );
    int ret = KVirtualFree( lpAddress, dwSize, dwFreeType );
    return ret;
}


//获得地址 lpAddress的使用情况
DWORD WINAPI VirtualQuery(
  LPCVOID lpAddress, 
  PMEMORY_BASIC_INFORMATION lpBuffer, 
  DWORD dwLength 
){
    printf("VirtualQuery 0x%X, 0x%X, %d\n", lpAddress, lpBuffer, dwLength );
    return 0;
}

//设置页面保护属性
BOOL WINAPI VirtualProtect( 
  LPVOID lpAddress, 
  DWORD dwSize, 
  DWORD flNewProtect, 
  PDWORD lpflOldProtect 
){
    printf("VirtualProtect 0x%X, %d, 0x%X, 0x%X\n", lpAddress, dwSize, flNewProtect, lpflOldProtect );
    return FALSE;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -