aboutsummaryrefslogtreecommitdiffstats
path: root/win32/syslinux.c
diff options
context:
space:
mode:
authorhpa <hpa>2004-12-15 10:28:29 +0000
committerhpa <hpa>2004-12-15 10:28:29 +0000
commit907b549d585c74537b300c188b00d3a56d36cc7f (patch)
tree580048f48a4b78553b0772ff9fecc07b04706cb5 /win32/syslinux.c
parentab17ed85f788d28130dc074281df7a08a25eb205 (diff)
downloadsyslinux-907b549d585c74537b300c188b00d3a56d36cc7f.tar.gz
syslinux-907b549d585c74537b300c188b00d3a56d36cc7f.tar.xz
syslinux-907b549d585c74537b300c188b00d3a56d36cc7f.zip
Change the win32 build procedure to match the new world; installer
not yet ported
Diffstat (limited to 'win32/syslinux.c')
-rw-r--r--win32/syslinux.c234
1 files changed, 234 insertions, 0 deletions
diff --git a/win32/syslinux.c b/win32/syslinux.c
new file mode 100644
index 00000000..0b6b1926
--- /dev/null
+++ b/win32/syslinux.c
@@ -0,0 +1,234 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * 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., 53 Temple Place Ste 330,
+ * Boston MA 02111-1307, 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;
+}