|
本帖最后由 2011yaya2007777 于 2020-12-16 15:15 编辑
[code]/*
* compile:
*
* gcc -Wl,--build-id=none -m64 -mno-sse -nostdlib -Wno-int-to-pointer-cast -fno-zero-initialized-in-bss -fno-function-cse -fno-jump-tables -Wl,-N -fPIE g4e_wb.c -o g4e_wb.o 2>&1|tee build.log
* generate executable: objcopy -O binary g4e_wb.o g4e_wb
*
*/
#include "grub4dos.h"
//在此定义静态变量、结构。不能包含全局变量,否则编译可以通过,但是不能正确执行。
//不能在main前定义子程序,在main后可以定义子程序。
static void get_GRUB_IMGE (void);
/* 这是必需的,请参阅grubprog.h中的注释 */
#include "grubprog.h"
/* 请勿在此处插入任何其他asm行 */
//不能包含子程序,不能包含全局变量,否则编译可以通过,但是不能正确执行。
int main(char *arg,int key)
{
get_GRUB_IMGE();
if (!GRUB_IMGE)
return 0;
return printf ("g4e_wb_func,%s",arg);
}
//在内存0-0x9ffff, 搜索特定字符串"$INT13SFGRUB4DOS",获得GRUB_IMGE
static void get_GRUB_IMGE (void)
{
int i, j;
for(i = 0x9F000; i >= 0; i -= 0x1000)
{
for(j = 0; j < 0x1000 ; j += 16)
{
char *p = (char *)(unsigned long long)(int)(i+j);
if (p[11]=='G' && p[12]=='R' && p[13]=='U' && p[14]=='B' && p[15]=='4' && p[16]=='D' && p[17]=='O' && p[18]=='S') //比较数据
{
GRUB_IMGE = *(unsigned long long *)(unsigned long long)(int)(i+j+32); //GRUB4DOS_for_UEFI文件地址
return;; //查到
}
}
}
return;
}
菜单:
title g4e_wb
g4e_wb abcdef
pause
|
|