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

📄 syslinux-mingw.c

📁 Windows上的精简Linux系统
💻 C
字号:
/* ----------------------------------------------------------------------- * *    *   Copyright 2003 Lars Munch Christensen - All Rights Reserved *	 *   Based on the Linux installer program for SYSLINUX by H. Peter Anvin * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139, *   USA; either version 2 of the License, or (at your option) any later *   version; incorporated herein by reference. * * ----------------------------------------------------------------------- *//* * syslinux-mingw.c - Win2k/WinXP installer program for SYSLINUX */#include <windows.h>#include <stdio.h>#include <ctype.h>#include "syslinux.h"char *program;			/* Name of program */char *drive;			/* Drive to install to *//* * Check Windows version. * * On Windows Me/98/95 you cannot open a directory, physical disk, or * volume using CreateFile. */int checkver(){  OSVERSIONINFO osvi;  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  GetVersionEx(&osvi);  return  (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) &&          ((osvi.dwMajorVersion > 4) ||          ((osvi.dwMajorVersion == 4) && (osvi.dwMinorVersion == 0)));}/* * Windows error function */void error(char* msg){  LPVOID lpMsgBuf;  /* Format the Windows error message */  FormatMessage( 		FORMAT_MESSAGE_ALLOCATE_BUFFER | 		FORMAT_MESSAGE_FROM_SYSTEM | 		FORMAT_MESSAGE_IGNORE_INSERTS,		NULL, GetLastError(),		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language		(LPTSTR) &lpMsgBuf, 0, NULL );    /* Print it */  fprintf(stderr, "%s: %s", msg, (char*) lpMsgBuf);  /* Free the buffer */  LocalFree(lpMsgBuf);}void usage(void){  fprintf(stderr, "Usage: syslinux.exe [-sf] <drive>:\n");  exit(1);}int main(int argc, char *argv[]){  HANDLE f_handle;  DWORD bytes_read;  DWORD bytes_written;  DWORD drives;  UINT drive_type;  static unsigned char sectbuf[512];  char **argp, *opt;  char drive_name[128];  char ldlinux_name[128];  int force = 0;		/* -f (force) option */  if (!checkver()) {    fprintf(stderr, "You need to be running at least Windows NT\n");    exit(1);	      }  program = argv[0];  drive = NULL;  for ( argp = argv+1 ; *argp ; argp++ ) {    if ( **argp == '-' ) {      opt = *argp + 1;      if ( !*opt )	usage();      while ( *opt ) {	if ( *opt == 's' ) {	  syslinux_make_stupid();	/* Use "safe, slow and stupid" code */        } else if ( *opt == 'f' ) {          force = 1;                    /* Force install */	} else {	  usage();	}	opt++;      }    } else {      if ( drive )	usage();      drive = *argp;    }  }  if ( !drive )    usage();  /* Test if drive exists */  drives = GetLogicalDrives();  if(!(drives & ( 1 << (tolower(drive[0]) - 'a')))) {    fprintf(stderr, "No such drive %c:\n", drive[0]);    exit(1);  }  /* Determines the drive type */  sprintf(drive_name, "%c:\\", drive[0]);  drive_type = GetDriveType(drive_name);  /* Test for removeable media */  if ((drive_type == DRIVE_FIXED) && (force == 0)) {    fprintf(stderr, "Not a removable drive (use -f to override) \n");    exit(1);  }  /* Test for unsupported media */  if ((drive_type != DRIVE_FIXED) && (drive_type != DRIVE_REMOVABLE)) {    fprintf(stderr, "Unsupported media\n");    exit(1);  }  /*   * First open the drive   */  sprintf(drive_name, "\\\\.\\%c:", drive[0]);  f_handle = CreateFile(drive_name, GENERIC_READ | GENERIC_WRITE,			 FILE_SHARE_READ | FILE_SHARE_WRITE,			 NULL, OPEN_EXISTING, 0, NULL );  if(f_handle == INVALID_HANDLE_VALUE) {    error("Could not open drive");    exit(1);  }  /*   * Read the boot sector   */    ReadFile(f_handle, sectbuf, 512, &bytes_read, NULL);  if(bytes_read != 512) {    fprintf(stderr, "Could not read the whole boot sector\n");    exit(1);  }    /* Check to see that what we got was indeed an MS-DOS boot sector/superblock */  if(!syslinux_check_bootsect(sectbuf,drive)) {    exit(1);  }  /* Make the syslinux boot sector */  syslinux_make_bootsect(sectbuf);  /* Write the syslinux boot sector into the boot sector */  SetFilePointer(f_handle, 0, NULL, FILE_BEGIN);  WriteFile( (HANDLE) f_handle, sectbuf, 512, &bytes_written, NULL ) ;  if(bytes_written != 512) {    fprintf(stderr, "Could not write the whole boot sector\n");    exit(1);  }  /* Close file */   CloseHandle(f_handle);  /* Create the filename */  sprintf(ldlinux_name, "%s%s", drive_name, "\\ldlinux.sys");   /* Change to normal attributes to enable deletion */  /* Just ignore error if the file do not exists */  SetFileAttributes(ldlinux_name, FILE_ATTRIBUTE_NORMAL);  /* Delete the file */  /* Just ignore error if the file do not exists */  DeleteFile(ldlinux_name);  /* Create ldlinux.sys file */  f_handle = CreateFile(ldlinux_name, GENERIC_READ | GENERIC_WRITE,			FILE_SHARE_READ | FILE_SHARE_WRITE,			NULL, CREATE_ALWAYS, 			FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY,			NULL );    if(f_handle == INVALID_HANDLE_VALUE) {    error("Unable to create ldlinux.sys");    exit(1);  }  /* Write ldlinux.sys file */  if (!WriteFile(f_handle, syslinux_ldlinux, syslinux_ldlinux_len, &bytes_written, NULL)) {    error("Could not write ldlinux.sys");    exit(1);  }  if (bytes_written != syslinux_ldlinux_len) {    fprintf(stderr, "Could not write whole ldlinux.sys\n");    exit(1);  }  /* Now flush the media */  if(!FlushFileBuffers(f_handle)) {    error("FlushFileBuffers failed");    exit(1);  }      /* Close file */   CloseHandle(f_handle);  /* Done! */  return 0;}

⌨️ 快捷键说明

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