This commit is contained in:
WindowsNT351 2024-04-13 19:49:00 +08:00
parent 2f88eef161
commit f029de168c
108 changed files with 321 additions and 4922 deletions

View File

@ -1,155 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#include <windows.h>
unsigned char __inline READ_PORT_UCHAR(unsigned char *port)
{
return _inp((unsigned short)port);
}
void __inline WRITE_PORT_UCHAR(unsigned char * port, unsigned char value)
{
_outp((unsigned short)port, (value));
}
#define LS_TSR_EMPTY 0x40
#define LS_THR_EMPTY 0x20
#define LS_RX_BREAK 0x10
#define LS_RX_FRAMING_ERR 0x08
#define LS_RX_PARITY_ERR 0x04
#define LS_RX_OVERRUN 0x02
#define LS_RX_DATA_READY 0x01
#define LS_RX_ERRORS ( LS_RX_FRAMING_ERR | LS_RX_PARITY_ERR | LS_RX_OVERRUN )
#define COM1_BASE 0x03F8
#define COM2_BASE 0x02F8
#define comTxBuffer 0x00
#define comRxBuffer 0x00
#define comDivisorLow 0x00
#define comDivisorHigh 0x01
#define comIntEnable 0x01
#define comIntId 0x02
#define comFIFOControl 0x02
#define comLineControl 0x03
#define comModemControl 0x04
#define comLineStatus 0x05
#define comModemStatus 0x06
#define IoPortBase ( (unsigned char *) COM1_BASE )
extern struct _ARGUMENTS
{
unsigned char ucVideoMode;
unsigned char ucComPort;
unsigned char ucBaudDivisor;
unsigned char ucPCIConfigType;
} BootArgs;
// 14400 = 8
// 16457 = 7 +/-
// 19200 = 6
// 23040 = 5
// 28800 = 4
// 38400 = 3
// 57600 = 2
// 115200 = 1
void OEMInitDebugSerial(void)
{
unsigned char ucArgs[3];
unsigned int dwSize;
dwSize = sizeof(ucArgs);
WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80); // Access Baud Divisor
WRITE_PORT_UCHAR(IoPortBase+comDivisorLow, BootArgs.ucBaudDivisor&0x7f); // 19200
WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00);
WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x01); // Enable FIFO if present
WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03); // 8 bit, no parity
WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00); // No interrupts, polled
WRITE_PORT_UCHAR(IoPortBase+comModemControl, 0x03); // Assert DTR, RTS
}
void OEMWriteDebugString(unsigned short *str)
{
while (*str)
{
while (!(READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_THR_EMPTY))
{
;
}
WRITE_PORT_UCHAR(IoPortBase+comTxBuffer, (unsigned char)*str++);
}
}
void OEMWriteDebugByte(BYTE ucChar)
{
while (!(READ_PORT_UCHAR(IoPortBase+comLineStatus) & LS_THR_EMPTY))
{
;
}
WRITE_PORT_UCHAR(IoPortBase+comTxBuffer, ucChar);
}
int iComTotal=0;
void OEMReadDebugBytes(unsigned char * ucBuffer, int usReadSize) {
int i=0;
unsigned char uStat;
while (usReadSize--) {
do {
uStat=READ_PORT_UCHAR(IoPortBase+comLineStatus);
if (uStat & LS_RX_ERRORS) {
while (1)
printf("port status error=%xh i=%u\r",uStat,iComTotal);
}
} while (!(uStat&LS_RX_DATA_READY));
ucBuffer[i++]=READ_PORT_UCHAR(IoPortBase+comRxBuffer);
iComTotal++;
}
}
int OEMReadDebugByte(void)
{
int i;
OEMReadDebugBytes((unsigned char *)&i,1);
return i;
}
/*****************************************************************************
*
*
* @func void | OEMClearDebugComError | Clear a debug communications er
or
*
*/
void
OEMClearDebugCommError(
void
)
{
}

View File

@ -1,45 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#ifndef _ETHERNET_H
#define _ETHERNET_H 1
/*
* Addressing info struct. We don't ARP for unknown ethernet addresses, so
* even the ethernet address must be configured.
*/
typedef struct _EDBG_ADDR {
DWORD dwIP;
USHORT wMAC[3];
USHORT wPort;
} EDBG_ADDR;
#define EDBG_SYSINTR_NOINTR 0xFFFFFFFF
// The following defs can be used for platforms which support multiple adapter types.
// Identifiers are provided here for drivers which are built in common\oak\drivers\ethdbg.
// Any platform specific adapter types can be identified based off of EDBG_ADAPTER_OEM.
#define EDBG_ADAPTER_SMC9000 0
#define EDBG_ADAPTER_NE2000 1
#define EDBG_ADAPTER_OEM 16
#endif // _ETHERNET_H

View File

@ -1,258 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Routines for the SMC9000 ethernet controller used for the debug
ethernet services. This file has been stripped of all but the
detect and functionality
Functions:
Notes:
--*/
#include <conio.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "loadcepc.h"
#include "smchw.h"
#include "wdm.h"
#include "ethernet.h"
#include "..\inc\bootarg.h"
BOOT_ARGS BootArgs;
// The base address for the card
static BYTE volatile *pbEthernetBase;
#define ReadWord( wOffset ) _inpw((USHORT)(pbEthernetBase + wOffset))
#define WriteWord( wOffset, Value ) _outpw((USHORT)(pbEthernetBase + wOffset), (USHORT)Value)
typedef struct _SMC_CONFIG
{
BYTE *pbIoBase;
USHORT wIRQ;
} SMC_CONFIG;
SMC_CONFIG Configs[] =
{
{ 0x300, 2 },
{ 0x320, 10},
{ 0x340, 11},
{ 0x360, 3}
};
#define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0]))
#define NUM_SMC_CONFIGS (NUM_ELEMENTS(Configs))
BOOL
SMCDetect(BYTE **ppbBaseAddress, USHORT *pwIrq)
{
int i;
USHORT BSR;
USHORT MyAddr[3];
for (i=0;i<NUM_SMC_CONFIGS;i++) {
*ppbBaseAddress = (BYTE *)pbEthernetBase = Configs[i].pbIoBase;
*pwIrq = Configs[i].wIRQ;
// The upper byte of the BSR always reads 0x33, use this to verify the I/O base
BSR = ReadWord(BANKSEL_REG);
if ((BSR & 0xFF00) == 0x3300) {
printf("SMCDetect: SMC board found at I/O base 0x%X\n",*ppbBaseAddress);
// Verify that a valid Ethernet address is loaded
WriteWord( BANKSEL_REG, BANK1 );
MyAddr[0] = ReadWord( MACADDR_REG0 );
MyAddr[1] = ReadWord( MACADDR_REG1 );
MyAddr[2] = ReadWord( MACADDR_REG2 );
if (MyAddr[0] || MyAddr[1] || MyAddr[2]) {
printf( "MAC Address:%02X:%02X:%02X:%02X:%02X:%02X\r\n",
MyAddr[0] & 0x00FF, MyAddr[0] >> 8,
MyAddr[1] & 0x00FF, MyAddr[1] >> 8,
MyAddr[2] & 0x00FF, MyAddr[2] >> 8 );
return TRUE;
}
else {
printf("SMCDetect: Invalid Ethernet address (check switch settings)\n");
return FALSE;
}
}
}
printf("SMCDetect: SMC board not found\n");
return FALSE;
} // SMCDetect
WORD
hex_atoi(char * hexstr)
{
WORD wRet = 0;
while (*hexstr) {
wRet <<= 4;
switch (*hexstr) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
wRet += (WORD)(*hexstr - '0');
break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
wRet += (WORD)(*hexstr - 'a');
wRet += 10;
break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
wRet += (WORD)(*hexstr - 'A');
wRet += 10;
break;
}
hexstr++;
}
return wRet;
} // hex_atoi
//
// Function to extract the debug ethernet adapter options from the command line
//
// Expect argstr = "/E:<card>:<io addr>:<irq>:<debug zone mask>"
//
// Return FALSE for failure
//
BOOL
ParseEthernetOptions(char * argstr)
{
BOOL bRet;
char * begin;
char * end;
char endch;
char CardType;
char * card;
BYTE *pBase;
USHORT wIRQ;
int a; // argument counter 0 = CardType, 1 = I/O Base Address, 2 = IRQ
bRet = FALSE;
if (strlen(argstr) < 10) { // "/E:1:123:1" at minimum
goto peo_exit;
}
end = argstr + 2;
//
// Extract the CardType, I/O Base address and IRQ from the command line
// (and super secret EDBG debug zone mask)
//
for (a = 0; a < 4; a++) {
begin = end;
//
// Colon delimited list
//
if (*begin != ':') {
break;
}
begin++; // skip colon
end = begin;
while ((*end) && (*end != ':')) {
end++;
}
if (begin == end) {
break;
}
endch = *end;
*end = 0; // temporarily zero terminate the option string
switch (a) {
case 0: // CardType
CardType = *begin;
break;
case 1: // I/O base address
pBase = (BYTE *)hex_atoi(begin);
break;
case 2: // IRQ
wIRQ = hex_atoi(begin);
break;
case 3: // EDBG Debug zone mask (defined in oak\inc\ethdbg.h)
BootArgs.dwEdbgDebugZone = (DWORD)hex_atoi(begin);
BootArgs.dwEdbgDebugZone |= 0x10000;
break;
default: // error!
goto peo_exit;
}
*end = endch; // un-zero-terminate if need be.
}
if (a < 3) {
goto peo_exit;
}
switch (CardType) {
case '0':
// Search for a SMC9000 debug Ethernet card
if (SMCDetect(&pBase, &wIRQ))
BootArgs.ucEdbgAdapterType = EDBG_ADAPTER_SMC9000;
else {
printf("Could not detect SMC9000 debug Ethernet card\n");
goto peo_exit;
}
card = "SMC9000";
break;
case '1':
BootArgs.ucEdbgAdapterType = EDBG_ADAPTER_NE2000;
card = "NE2000";
break;
default:
goto peo_exit;
}
BootArgs.ucEdbgIRQ = wIRQ;
// WARNING - must mask off high bits
BootArgs.dwEdbgBaseAddr = (DWORD)pBase & 0xFFFF;
BootArgs.ucLoaderFlags |= LDRFL_USE_EDBG;
printf("Debug network card: %s at I/O port 0x%x, IRQ 0x%x\n", card, pBase, wIRQ);
bRet = TRUE;
peo_exit:
return bRet;
} // ParseEthernetOptions

View File

@ -1,45 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#ifndef _ETHERNET_H
#define _ETHERNET_H 1
/*
* Addressing info struct. We don't ARP for unknown ethernet addresses, so
* even the ethernet address must be configured.
*/
typedef struct _EDBG_ADDR {
DWORD dwIP;
USHORT wMAC[3];
USHORT wPort;
} EDBG_ADDR;
#define EDBG_SYSINTR_NOINTR 0xFFFFFFFF
// The following defs can be used for platforms which support multiple adapter types.
// Identifiers are provided here for drivers which are built in common\oak\drivers\ethdbg.
// Any platform specific adapter types can be identified based off of EDBG_ADAPTER_OEM.
#define EDBG_ADAPTER_SMC9000 0
#define EDBG_ADAPTER_NE2000 1
#define EDBG_ADAPTER_OEM 16
#endif // _ETHERNET_H

View File

@ -1,18 +0,0 @@
#include "windows.h"
#include <string.h>
#define LOCKFLAG_WRITE 1
#define int long
#define ZONE_DEBUG 1
#define DEBUGMSG(a, b) printf b
int OEMParallelPortGetByte(void);
VOID OEMParallelPortSendByte(BYTE chData);
#define LockPages(a, b, c, d)
#define UnlockPages(a, b)
#define KUnicodeToAscii(a, b, c) strncpy(a, b, c)

View File

@ -1,18 +0,0 @@
#define TRUE 1
#define FALSE 0
typedef int BOOL;
typedef unsigned char BYTE, *LPBYTE, UCHAR, *PUCHAR;
typedef unsigned int USHORT, *PUSHORT;
typedef unsigned long ULONG, *PULONG;
typedef unsigned short WORD, *PWORD;
typedef unsigned long DWORD, *PDWORD;
typedef signed char INT8;
typedef unsigned char UINT8;
typedef signed short INT16;
typedef unsigned short UINT16;
typedef signed int INT32;
typedef unsigned int UINT32;

View File

@ -1,132 +0,0 @@
# Microsoft Visual C++ generated build script - Do not modify
PROJ = LOADCEPC
DEBUG = 0
PROGTYPE = 6
CALLER =
ARGS =
DLLS =
D_RCDEFINES = -d_DEBUG
R_RCDEFINES = -dNDEBUG
ORIGIN = MSVC
ORIGIN_VER = 1.00
PROJPATH = d:\WINCE\PLATFORM\CEPC\LOADCEPC\
USEMFC = 0
CC = cl
CPP = cl
CXX = cl
CCREATEPCHFLAG =
CPPCREATEPCHFLAG =
CUSEPCHFLAG =
CPPUSEPCHFLAG =
FIRSTC = MAIN.C
FIRSTCPP =
RC = rc
CFLAGS_D_DEXE = /I . /nologo /G2 /W4 /Z7 /Od /D "_DEBUG" /D "_DOS" /Fc /FR
CFLAGS_R_DEXE = /I . /nologo /Gs /G2 /W4 /Z7 /Ox /D "NDEBUG" /D "_DOS" /Fc /FR
LFLAGS_D_DEXE = /NOLOGO /NOI /STACK:5120 /ONERROR:NOEXE /CO /MAP /LINE
LFLAGS_R_DEXE = /NOLOGO /NOI /STACK:5120 /ONERROR:NOEXE /CO /MAP /LINE
LIBS_D_DEXE = slibce oldnames
LIBS_R_DEXE = slibce oldnames
RCFLAGS = /nologo
RESFLAGS = /nologo
RUNFLAGS =
OBJS_EXT = TRANSFER.OBJ
LIBS_EXT =
!if "$(DEBUG)" == "1"
CFLAGS = $(CFLAGS_D_DEXE)
LFLAGS = $(LFLAGS_D_DEXE)
LIBS = $(LIBS_D_DEXE)
MAPFILE = nul
RCDEFINES = $(D_RCDEFINES)
!else
CFLAGS = $(CFLAGS_R_DEXE)
LFLAGS = $(LFLAGS_R_DEXE)
LIBS = $(LIBS_R_DEXE)
MAPFILE = nul
RCDEFINES = $(R_RCDEFINES)
!endif
!if [if exist MSVC.BND del MSVC.BND]
!endif
SBRS = MAIN.SBR \
XMSAPI.SBR \
VIDEO.SBR \
PPFS.SBR
TRANSFER_DEP =
MAIN_DEP = d:\wince\platform\cepc\loadcepc\loadcepc.h \
d:\wince\platform\cepc\loadcepc\xmsapi.h
XMSAPI_DEP = d:\wince\platform\cepc\loadcepc\xmsapi.h
VIDEO_DEP = d:\wince\platform\cepc\loadcepc\loadcepc.h \
d:\wince\platform\cepc\loadcepc\video.h
MDPPFS_DEP = d:\wince\platform\cepc\ppfstool\wdm.h \
d:\wince\platform\cepc\ppfstool\pc.h
PPFS_DEP = d:\wince\platform\cepc\ppfstool\kernel.h
PPFSTOOL_DEP = d:\wince\platform\cepc\ppfstool\ppfs.h
ETHMAIN_DEP = d:\wince\platform\cepc\loadcepc\loadcepc.h \
d:\wince\platform\cepc\loadcepc\smchw.h
all: $(PROJ).EXE $(PROJ).BSC
MAIN.OBJ: MAIN.C $(MAIN_DEP)
$(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c MAIN.C
XMSAPI.OBJ: XMSAPI.C $(XMSAPI_DEP)
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c XMSAPI.C
VIDEO.OBJ: VIDEO.C $(VIDEO_DEP)
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c VIDEO.C
MDPPFS.OBJ: MDPPFS.C $(MDPPFS_DEP)
$(CC) $(CFLAGS) $(CCREATEPCHFLAG) /c MDPPFS.C
PPFS.OBJ: PPFS.C $(PPFS_DEP)
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c PPFS.C
DEBUG.OBJ: DEBUG.C $(PPFS_DEP)
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c DEBUG.C
PPFSTOOL.OBJ: PPFSTOOL.C $(PPFSTOOL_DEP)
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c PPFSTOOL.C
ETHMAIN.OBJ: ETHMAIN.C $(ETHMAIN_DEP)
$(CC) $(CFLAGS) $(CUSEPCHFLAG) /c ETHMAIN.C
$(PROJ).EXE:: MAIN.OBJ XMSAPI.OBJ VIDEO.OBJ MDPPFS.OBJ DEBUG.OBJ PPFS.OBJ PPFSTOOL.OBJ ETHMAIN.OBJ $(OBJS_EXT) $(DEFFILE)
echo >NUL @<<$(PROJ).CRF
MAIN.OBJ +
XMSAPI.OBJ +
VIDEO.OBJ +
MDPPFS.OBJ +
PPFS.OBJ +
PPFSTOOL.OBJ +
ETHMAIN.OBJ +
DEBUG.OBJ +
$(OBJS_EXT)
$(PROJ).EXE
$(MAPFILE)
c:\msvc\lib\+
$(LIBS)
$(DEFFILE);
<<
link $(LFLAGS) @$(PROJ).CRF
run: $(PROJ).EXE
$(PROJ) $(RUNFLAGS)
$(PROJ).BSc: $(SBRS)
bscmake @<<
/o$@ $(SBRS)
<<

View File

@ -1,11 +0,0 @@
#define TRUE 1
#define FALSE 0
typedef int BOOL;
typedef unsigned char UCHAR, *PUCHAR;
typedef unsigned int USHORT, *PUSHORT;
typedef unsigned long ULONG, *PULONG;
typedef unsigned short WORD, *PWORD;
typedef unsigned long DWORD, *PDWORD;

View File

@ -1,976 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#include <conio.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "loadcepc.h"
#include "xmsapi.h"
#include "ethernet.h"
#include "..\inc\bootarg.h"
#pragma warning(disable: 4001)
#define CHUNKSIZE 32768
#define COPY_FLAG_UPDATE_EXISTING 0x0001
#define COPY_FLAG_UPDATE_OR_ADD 0x0002
int LoadImage(BOOL bVerbose, BOOL bParallelDownload, char *pszFileName, PULONG pulEntryAddress);
int ExecuteImage(BOOL bVerbose, ULONG ulEntryPoint);
void Launch(ULONG ulEntryPoint, ULONG ulArguments);
UCHAR SetVideoMode(UCHAR iDesiredMode);
UCHAR GetPCIConfigMechanism();
BOOL ParseEthernetOptions(char * argstr);
extern int NoPPFS; // parallel port not present flag
int OEMParallelPortGetByte(void);
void OEMParallelPortSendByte(UCHAR chData);
void OEMParallelPortInit(void);
void DisplayDirectory(char *pszPath);
void GetFile(char *pszSource, char *pszDestination, USHORT usCopyFlags);
BOOL SMCDetect(BYTE **ppbBaseAddress, USHORT *pwIrq);
const unsigned char BootHeader[] = {
0xAA, // header = 4 bytes
0x55,
0x55,
0xAA,
0x00, // opcode = 2 bytes (0 = BOOT)
0x00,
};
#define BOOT_HEADER_SIZE (sizeof(BootHeader) / sizeof(BootHeader[0]))
const unsigned char BootTail[] = {
0x5A, // trail = 4 bytes
0xA5,
0x0A,
0x1A
};
#define BOOT_TAIL_SIZE (sizeof(BootTail) / sizeof(BootTail[0]))
#define BOOT_TYPE -4 // boot type for x86
struct
{
ULONG ulRate;
UCHAR ucDivisor;
} BaudTable[] =
{
{ 9600, 12 },
{ 19200, 6 },
{ 38400, 3 },
{ 57600, 2 },
{ 115200, 1 }
};
#define NUM_BAUD_RATES (sizeof(BaudTable) / sizeof(BaudTable[0]))
BOOT_ARGS BootArgs;
BOOL bSerialDownload=FALSE;
extern int OEMReadDebugByte(void);
extern void OEMReadDebugBytes(unsigned char * ucBuffer, int usReadSize);
extern void OEMWriteDebugByte(unsigned char ch);
void
usage(char *pszProgramNameArg)
{
char * pszProgram;
pszProgram = strrchr(pszProgramNameArg, '\\');
if (pszProgram != NULL)
{
pszProgram++;
}
else
{
pszProgram = pszProgramNameArg;
}
printf(
"%s: Loads an NK ROM image into memory and boots it\n\n"
"Usage:%s [/B:baud] [/C:port] [/D:display] [/E:Card:IO:IRQ] [/P] [/Q]\n"
"\t\t[/H] [/V] [<file name>]\n\n"
"\t/B\tBaudrate - 9600, 19200, 38400, 57600, or 115200 (default 19200)\n"
"\t/C\tCOM Port - 1 = COM1, 2 = COM2 (default COM1)\n"
"\t/D\tDisplay Resolution - 0 = 320x200 (default), 1 = 480x240x256,\n"
"\t\t\t2 = 640x480x256, 3 = 800x600x256, 4 = 1024x768x256\n"
"\t\t\t5 = 240x320x256 \n"
"\t/P\tParallel port boot download.\n"
"\t/Q\tSerial port boot download.\n"
"\t/E:Card:IO:IRQ\tCard 0 = SMC9000, 1 = NE2000 (For Debug Ethernet)\n"
"\t\t\t(Other debug ethernet options in hex digits)\n"
"\t/H\tHelp - displays this message\n"
"\t/V\tVerbose - displays extra status information during boot\n"
"\n\tDefault <file name> is NK.BIN except for /P option which uses\n"
"\tdefault on host unless <file name> specified.\n"
"\nPress any key for more options...\n",
pszProgram, pszProgram);
__asm
{
push dx
xor ax,ax
int 0x16
pop dx
}
printf(
"usage: %s -s[:]<pattern> -(g|r|u)[[:]<pattern> [<destination>]\n"
"-s Show a directory of files matching <pattern>.\n\n"
"-g Get files matching <pattern> and copy them to the\n"
" optionally specified <destination>. Any existing file with\n"
" the same name will be overwritten.\n\n"
"-r Refresh files matching <pattern> which already exist in <destination>\n"
" and have a timestamp newer than the one in <destination>.\n\n"
"-u Update files matching <pattern> which don't already exist in\n"
" <destination> or those that have a timestamp newer than those\n"
" in <destination>.\n\n"
"<pattern> Windows filename path with optional wildcard characters.\n\n"
"<destination> If not specified then the current directory is the\n"
" default.\n"
" If specified and it doesn't exist and the last character is \\,\n"
" then the directory is created. Otherwise <destination> is\n"
" treated as the name of the file.\n"
" It is an error for <pattern> to match multiple files\n"
" when <destination> specifies a file.\n",
pszProgram);
}
int
main(int argc, char **argv)
{
char * pszFileName = "nk.bin";
ULONG ulEntryPoint;
ULONG ulArguments;
int xmsError;
BOOL bEnabled;
BOOL bVerbose = FALSE;
BOOL bParallelDownload=FALSE;
int iDesiredMode = 0;
ULONG ulBaudRate;
char cOption;
int i;
int iPpfstool=0;
/* Set up boot args struct */
BootArgs.ucVideoMode = 0;
BootArgs.ucComPort = 1;
BootArgs.ucBaudDivisor = 6;
BootArgs.ucPCIConfigType = 0;
BootArgs.dwSig = BOOTARG_SIG;
BootArgs.dwLen = sizeof(BOOT_ARGS);
OEMParallelPortInit(); // initialize parallel port
/*
** Parse arguments
*/
if (argc > 1)
{
int iArgIndex;
for (iArgIndex = 1; iArgIndex < argc; iArgIndex++)
{
if (argv[iArgIndex][0] != '/' && argv[iArgIndex][0] != '-')
{
break;
}
cOption=tolower(argv[iArgIndex][1]);
switch (argv[iArgIndex][1])
{
case 'b': /* Baud rate */
case 'B':
if (argv[iArgIndex][2] != ':' ||
argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '9')
{
printf("Invalid option - %s\n", argv[iArgIndex]);
usage(argv[0]);
return 1;
}
ulBaudRate = atol(&argv[iArgIndex][3]);
for (i = 0; i < NUM_BAUD_RATES; i++)
{
if (BaudTable[i].ulRate == ulBaudRate)
{
BootArgs.ucBaudDivisor = BaudTable[i].ucDivisor;
break;
}
}
if (i >= NUM_BAUD_RATES)
{
printf("Unsupported baud rate - %s\n", argv[iArgIndex]);
usage(argv[0]);
return 1;
}
break;
case 'c': /* COM port */
case 'C':
if (argv[iArgIndex][2] != ':' ||
(argv[iArgIndex][3] != '1' && argv[iArgIndex][3] != '2' &&
argv[iArgIndex][3] != '3' && argv[iArgIndex][3] != '4'))
{
printf("Invalid option - %s\n", argv[iArgIndex]);
usage(argv[0]);
return 1;
}
BootArgs.ucComPort = (UCHAR)(argv[iArgIndex][3] - '0');
break;
case 'd': /* Display mode */
case 'D':
if (argv[iArgIndex][2] != ':' ||
argv[iArgIndex][3] < '0' || argv[iArgIndex][3] > '5')
{
printf("Invalid option - %s\n", argv[iArgIndex]);
usage(argv[0]);
return 1;
}
iDesiredMode = argv[iArgIndex][3] - '0';
break;
case 'p': /* Parallel port boot download */
case 'P':
bParallelDownload=TRUE;
pszFileName= NULL;
break;
case 'q': /* Serial port boot download */
case 'Q':
bSerialDownload=TRUE;
pszFileName= NULL;
break;
case 'v':
case 'V':
bVerbose = TRUE;
break;
case 'S':
case 's':
{
char *pszPath;
iPpfstool=1;
if (argv[iArgIndex][2] != '\0')
{
pszPath = &argv[iArgIndex][2];
if (*pszPath == ':')
{
pszPath++;
}
}
else if (argc > (i+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/')
{
pszPath = argv[iArgIndex+1];
i++;
}
else
{
pszPath = "*.*";
}
DisplayDirectory(pszPath);
}
break;
case 'E':
case 'e':
if (!ParseEthernetOptions(argv[iArgIndex])) {
printf("Invalid option - %s\n", argv[iArgIndex]);
usage(argv[0]);
return 1;
}
break;
case 'G':
case 'R':
case 'U':
case 'g':
case 'r':
case 'u':
{
char *pszSource;
char *pszDestination;
iPpfstool=1;
if (argv[iArgIndex][2] != '\0')
{
pszSource = &argv[iArgIndex][2];
if (*pszSource == ':')
{
pszSource++;
}
}
else if (argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/')
{
pszSource = argv[iArgIndex+1];
iArgIndex++;
}
else
{
printf("Error source path missing\n");
break;
}
if (argc > (iArgIndex+1) && argv[iArgIndex+1][0] != '-' && argv[iArgIndex+1][0] != '/')
{
pszDestination = argv[iArgIndex+1];
i++;
}
else
{
pszDestination = NULL;
}
GetFile(
pszSource, pszDestination,
cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING :
cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD :
0);
}
break;
default:
printf("Unrecognized option - %s\n", argv[iArgIndex]);
/* FALL THROUGH */
case '?':
case 'h':
case 'H':
usage(argv[0]);
return 1;
}
}
if (iArgIndex == (argc - 1))
{
pszFileName = argv[iArgIndex];
}
}
if (iPpfstool)
return 0;
if (!XmsIsInstalled())
{
printf("HIMEM.SYS must be loaded\n");
return 2;
}
if (bVerbose)
{
if ((xmsError = XmsQueryA20(&bEnabled)) != XMS_SUCCESS)
{
printf("Error querying A20 status - %s\n", XmsErrorString(xmsError));
return 3;
}
if (bEnabled)
{
printf("Warning A20 line already enabled\n");
}
}
/*
** Check if PCI Bios is available, if so find out config mechanism
*/
BootArgs.ucPCIConfigType = GetPCIConfigMechanism();
if (!LoadImage(bVerbose, bParallelDownload, pszFileName, &ulEntryPoint))
{
return 4;
}
/*
** Enable A20 line
*/
if ((xmsError = XmsLocalEnableA20()) != XMS_SUCCESS)
{
printf("Can't enable A20 line, error = 0x%4.4X\n", xmsError);
return 5;
}
BootArgs.ucVideoMode = SetVideoMode(iDesiredMode);
if (bSerialDownload)
BootArgs.ucBaudDivisor|=0x80;
if (bVerbose)
{
printf("Jumping to 0x%8.8lX\n", ulEntryPoint);
}
/*
** Convert arguments to linear addres
*/
ulArguments = (((ULONG)(void far *)&BootArgs) >> 16) << 4;
ulArguments += ((ULONG)(void far *)&BootArgs) & 0xFFFF;
Launch(ulEntryPoint, ulArguments);
/*
** Launch shouldn't have returned
*/
return 0;
}
USHORT DownloadRead(int hImage, UCHAR* ucBuffer, USHORT usReadSize, BOOL bParallelDownload) {
int loop, loop2;
if (bParallelDownload) {
for (loop = 0; loop < usReadSize; loop++ ) {
ucBuffer[loop]= (UCHAR)OEMParallelPortGetByte();
if (NoPPFS)
return 0;
}
return usReadSize;
} else if (bSerialDownload) {
OEMReadDebugBytes(ucBuffer,usReadSize);
return usReadSize;
} else
return _read(hImage, ucBuffer, usReadSize);
}
int
LoadImage(BOOL bVerbose, BOOL bParallelDownload, char *pszFileName, PULONG pulEntryPoint)
{
int hImage;
long lImageSize;
int xmsError;
USHORT usTotalFree;
USHORT usLargestBlock;
USHORT usBlockHandle;
ULONG ulLinearAddress;
ULONG ulSectionAddress;
ULONG ulSectionSize;
ULONG ulSectionChecksum;
ULONG ulSectionOffset;
ULONG ulChecksum;
USHORT usReadSize;
USHORT usAmountRead;
ULONG ulReadTotal=0;
ULONG ulReadProgress=0;
USHORT usIndex;
static UCHAR ucBuffer[ CHUNKSIZE ];
static UCHAR ucSignature[] = { 'B', '0', '0', '0', 'F', 'F', '\n' };
int i;
UCHAR BootPacket[256];
UCHAR *pDestByte;
UCHAR *pTemp;
unsigned int chksum;
long int uiTemp;
long int bootType;
unsigned len;
/*
** Stop the floppy motor in case it contained the image file
*/
__asm
{
push dx
mov dx, 03F2h ; Floppy motor and DMA control
in al, dx
and al, 00Fh ; Clear motor on bits
out dx, al
pop dx
}
/*
** Find the largest Extended Memory block and allocate it
*/
xmsError = XmsQueryFreeExtendedMemory(&usLargestBlock, &usTotalFree);
if (xmsError != XMS_SUCCESS)
{
printf("Error querying free extended memory - %s\n", XmsErrorString(xmsError));
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
if (bVerbose)
{
/*
** Print info about memory available
*/
printf(
"Total free extended memory = %u, largest block = %u\n",
usTotalFree, usLargestBlock);
}
xmsError = XmsAllocateExtendedMemory(usLargestBlock, &usBlockHandle);
if (xmsError != XMS_SUCCESS)
{
printf("Error allocating extended memory - %s\n", XmsErrorString(xmsError));
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
/*
** Lock the block and obtain its linear address. Then ensure that the
** image fits into it.
*/
xmsError = XmsLockExtendedMemory(usBlockHandle, &ulLinearAddress);
if (xmsError != XMS_SUCCESS)
{
fprintf(stderr, "\r \r");
printf("Error locking extended memory - %s\n", XmsErrorString(xmsError));
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
if (bVerbose)
{
/*
** Print info about block allocated
*/
fprintf(stderr, "\r \r");
printf("Block allocated at 0x%lX\n", ulLinearAddress);
}
/*
** Zero upper memory in CHUNKSIZE chunks
*/
memset(ucBuffer, 0, sizeof(ucBuffer));
ulSectionSize = (ULONG)usLargestBlock * 1024;
#if 1
for (ulSectionOffset = 0; ulSectionOffset < ulSectionSize; ulSectionOffset += usReadSize)
{
if ((ulSectionSize - ulSectionOffset) < CHUNKSIZE)
{
usReadSize = (USHORT)(ulSectionSize - ulSectionOffset);
}
else
{
usReadSize = CHUNKSIZE;
}
xmsError = XmsMoveExtendedMemory(
0, (ULONG)(UCHAR far *)ucBuffer,
usBlockHandle, ulSectionOffset, usReadSize);
if (xmsError != XMS_SUCCESS)
{
fprintf(stderr, "\r \r");
printf("Error zeroing extended memory - %s\n", XmsErrorString(xmsError));
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
}
#endif
/*
** Open image file
*/
if (bSerialDownload)
OEMInitDebugSerial();
if (bParallelDownload || bSerialDownload) {
//
// Prepare boot packet
//
pDestByte = BootPacket;
for (i = 0; i < BOOT_HEADER_SIZE; i++) {
*pDestByte++ = BootHeader[i];
}
chksum = 0;
len = 9;
if (pszFileName) {
if (bSerialDownload)
printf("Loading image %s via serial port.\r\n",pszFileName);
else
printf("Loading image %s via parallel port.\r\n",pszFileName);
bootType = 1; // The NULL byte
for (pTemp = pszFileName; *pTemp; pTemp++) {
bootType++;
}
len += bootType;
} else {
if (bSerialDownload)
printf("Loading host default image via serial port.\r\n");
else
printf("Loading host default image via parallel port.\r\n");
bootType = BOOT_TYPE;
}
uiTemp = len;
for (i = 0; i < 2; i++) {
*pDestByte++ = (unsigned char)(uiTemp & 0xFF);
chksum += (uiTemp & 0xFF);
uiTemp >>= 8;
}
uiTemp = bootType;
for (i = 0; i < 4; i++) {
*pDestByte++ = (unsigned char)(uiTemp & 0xFF);
chksum += (uiTemp & 0xFF);
uiTemp >>= 8;
}
if (bootType > 0) {
for (pTemp = pszFileName; *pTemp; pTemp++) {
*pDestByte++ = *pTemp;
chksum += *pTemp;
}
*pDestByte++ = 0;
}
*pDestByte++ = (unsigned char)((~chksum) & 0xFF);
for (i = 0; i < BOOT_TAIL_SIZE; i++) {
*pDestByte++ = BootTail[i];
}
if (bVerbose)
printf("Sending boot packet: ");
usIndex=0;
while (&BootPacket[usIndex] < pDestByte) {
if (NoPPFS)
return FALSE;
if (bVerbose)
printf("%x ",BootPacket[usIndex]);
if (bSerialDownload)
OEMWriteDebugByte(BootPacket[usIndex]);
else
OEMParallelPortSendByte(BootPacket[usIndex]);
usIndex++;
}
if (bVerbose)
printf("Sent.\r\n");
} else {
hImage = _open(pszFileName, _O_BINARY | _O_RDONLY);
if (hImage == -1)
{
printf("%s: Error opening file - %s\n", pszFileName, _strerror(NULL));
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
return FALSE;
}
if ((lImageSize = _filelength(hImage)) == -1)
{
printf("%s: Error obtaining file size - %s\n", pszFileName, _strerror(NULL));
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
if (bVerbose)
{
printf("Loading %s, size = %ld\n", pszFileName, lImageSize);
}
}
/*
** Read initial signature and physical start and size
*/
usReadSize = sizeof(ucSignature) + 2 * sizeof(ULONG);
if (DownloadRead(hImage, &ucBuffer, usReadSize, bParallelDownload) != (int)usReadSize)
{
printf("Error reading signature - %s\n", _strerror(NULL));
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
if (memcmp(ucBuffer, ucSignature, sizeof(ucSignature)) != 0)
{
printf("Error invalid signature\nData: ");
for (i=0; i<usReadSize; i++)
printf("%x ",ucBuffer[i]);
printf("\r\n");
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
ulReadTotal=*(PULONG)&ucBuffer[sizeof(ucSignature) + sizeof(ULONG)];
if (bVerbose)
{
/*
** Print Physical start and size
*/
printf(
"Image physical start = 0x%8.8lX, size = %ld\n",
*(PULONG)&ucBuffer[sizeof(ucSignature)],
*(PULONG)&ucBuffer[sizeof(ucSignature) + sizeof(ULONG)]);
}
// Initialize the percent thingie.
DrawPercent((DWORD)-1, (DWORD)"");
/*
** Copy file to upper memory in CHUNKSIZE chunks
*/
for ( ; ; )
{
usAmountRead = DownloadRead(hImage, ucBuffer, 3 * sizeof(ULONG), bParallelDownload);
ulReadProgress+=12;
if (usAmountRead != 3 * sizeof(ULONG))
{
fprintf(stderr, "\r \r");
printf("Error reading header - %s\n", XmsErrorString(xmsError));
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
ulSectionAddress = *(PULONG)&ucBuffer[0];
ulSectionSize = *(PULONG)&ucBuffer[4];
ulSectionChecksum = *(PULONG)&ucBuffer[8];
if (ulSectionAddress == 0)
{
*pulEntryPoint = ulSectionSize;
break;
}
if (ulSectionAddress < ulLinearAddress ||
(ulSectionAddress + ulSectionSize) >
(ulLinearAddress + (ULONG)usLargestBlock * 1024))
{
fprintf(stderr, "\r \r");
printf(
"Error image section doesn't fit in allocated block\n"
"Block allocated at 0x%lX, size = %ld\n"
"Section physical start = 0x%8.8lX, size = %ld\n",
ulLinearAddress, (ULONG)usLargestBlock * 1024,
ulSectionAddress, ulSectionSize);
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
if (bVerbose)
{
fprintf(stderr, "\r \r");
printf(
"Section physical start = 0x%8.8lX, size = %ld\n",
ulSectionAddress, ulSectionSize);
}
ulChecksum = 0;
for (ulSectionOffset = 0; ulSectionOffset < ulSectionSize; )
{
if ((ulSectionSize - ulSectionOffset) < CHUNKSIZE)
{
usReadSize = (USHORT)(ulSectionSize - ulSectionOffset);
}
else
{
usReadSize = CHUNKSIZE;
}
usAmountRead = DownloadRead(hImage, ucBuffer, usReadSize,bParallelDownload);
if (usAmountRead != usReadSize)
{
fprintf(stderr, "\r \r");
printf("Error reading section - %s\n", XmsErrorString(xmsError));
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
ulReadProgress+= usReadSize;
DrawPercent(ulReadProgress, ulReadTotal);
#if 0
for (usIndex = 0; usIndex < usAmountRead; usIndex++)
{
ulChecksum += ucBuffer[usIndex];
}
#endif
#if 1
xmsError = XmsMoveExtendedMemory(
0, (ULONG)(UCHAR far *)ucBuffer,
usBlockHandle, ulSectionAddress - ulLinearAddress + ulSectionOffset,
(usAmountRead + 1) & ~1U);
if (xmsError != XMS_SUCCESS)
{
fprintf(stderr, "\r \r");
printf("Error moving extended memory - %s\n", XmsErrorString(xmsError));
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
#endif
ulSectionOffset += usAmountRead;
}
#if 0
if (ulChecksum != ulSectionChecksum)
{
fprintf(stderr, "\r \r");
printf(
"Bad checksum 0x%8.8lX, expected 0x%8.8lX\n",
ulChecksum, ulSectionChecksum);
XmsUnlockExtendedMemory(usBlockHandle);
XmsFreeExtendedMemory(usBlockHandle);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
return FALSE;
}
#endif
}
DrawPercent(ulReadTotal, ulReadTotal);
if (!bParallelDownload && !bSerialDownload)
_close(hImage);
/*
** Stop the floppy motor in case it contained the image file
*/
__asm
{
push dx
mov dx, 03F2h ; Floppy motor and DMA control
in al, dx
and al, 00Fh ; Clear motor on bits
out dx, al
pop dx
}
fprintf(stderr, "\r \r");
return TRUE;
}
UCHAR
GetPCIConfigMechanism()
{
UCHAR ucPCIVersionMajor;
UCHAR ucPCIVersionMinor;
UCHAR ucPCIBus;
UCHAR ucPCIConfigMech;
__asm
{
mov ax, 0xB101
int 0x1A
jc noPCI
cmp dx, 0x4350 ; 'CP'
jne noPCI
or ah, ah
jnz noPCI
mov ucPCIVersionMajor, bh
mov ucPCIVersionMinor, bl
mov ucPCIBus, cl
and al, 0x03
mov ucPCIConfigMech, al
}
printf(
"%d PCI bus%s (Version %X.%2.2X) using Configuration Mechanism # %d\n",
ucPCIBus + 1, ucPCIBus == 0 ? "" : "ses",
ucPCIVersionMajor, ucPCIVersionMinor, ucPCIConfigMech);
return (ucPCIBus << 2) | ucPCIConfigMech;
noPCI:
printf("PCI bus not detected\n");
return 0;
}

View File

@ -1,488 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
mdppfs.c
Abstract:
This file implements the NK kernel ppfs client side interface
Notes:
--*/
#include "windows.h"
#include "wdm.h"
#include "pc.h"
#define PAR_PORT_BASE 0x0378
#define PAR_PORT_DATA 0
#define PAR_PORT_STAT 1
#define PAR_PORT_CTRL 2
#define PAR_STAT_NBUSY 0x80
#define PAR_STAT_NACK 0x40
#define PAR_STAT_PE 0x20
#define PAR_STAT_SLCT 0x10
#define PAR_STAT_NERR 0x08 // This isn't connected
#define PAR_CTRL_READ 0x20
#define PAR_CTRL_IRQE 0x10
#define PAR_CTRL_SLCT_IN 0x08
#define PAR_CTRL_NINIT 0x04
#define PAR_CTRL_AUTOFEED 0x02
#define PAR_CTRL_STROBE 0x01
#define STATUS_IS_DISCONNECTED(a) \
((((a) & (PAR_STAT_PE | PAR_STAT_SLCT)) != PAR_STAT_SLCT) || \
(((a) & (PAR_STAT_NBUSY | PAR_STAT_NACK)) == PAR_STAT_NACK))
//#define STATUS_IS_DISCONNECTED(a) (!((a) & PAR_STAT_SLCT))
#if DEBUG
#define LOG_ENTRY_TYPE_MASK 0xFF00
#define LOG_ENTRY_DATA_MASK 0x00FF
#define LOG_ENTRY_READ ((USHORT)('R' << 8))
#define LOG_ENTRY_WRITE ((USHORT)('W' << 8))
#define LOG_ENTRY_CONTROL ((USHORT)('C' << 8))
#define LOG_ENTRY_STATUS ((USHORT)('S' << 8))
#define LOG_ENTRY_DATA ((USHORT)('D' << 8))
#define LOG_ENTRY_EXIT ((USHORT)('E' << 8))
#define LOG_ENTRY_EVENT ((USHORT)('V' << 8))
#define LOG_EVENT_SKIP_RECEIVE ((USHORT)0)
#define LOG_EVENT_BAD_STATUS ((USHORT)1)
#define LOG_EVENT_BAD_DISCONNECT ((USHORT)2)
#define NUMBER_LOG_EVENTS 3
TCHAR *EventDescriptions[NUMBER_LOG_EVENTS] =
{
TEXT("# Skipped Receives"),
TEXT("# Bad Status"),
TEXT("# Bad Disconnect"),
};
DWORD dwEventCounters[NUMBER_LOG_EVENTS];
VOID LogEntry(USHORT usEntry);
VOID DumpLog(VOID);
VOID DumpCounters(VOID);
#define LOG_ENTRY(a) LogEntry(a)
#define DUMP_LOG() DumpLog()
#else
#define LOG_ENTRY(a)
#define DUMP_LOG()
#endif
extern volatile DWORD *PtrCurMSec; /* current millisecond counter */
#define IoPortBase ((PUCHAR)PAR_PORT_BASE)
BOOL NoPPFS;
BOOL bLastOpWasWrite;
BOOL __inline VerifyDisconnect(VOID)
{
int i;
USHORT usStatus;
for (i = 0; i < 3; i++)
{
usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT);
LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus));
if (!STATUS_IS_DISCONNECTED(usStatus))
{
LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS);
return FALSE;
}
}
return TRUE;
}
BOOL WaitForStatus(USHORT usMask, USHORT usValue)
{
USHORT usStatus;
DWORD msecStart = *PtrCurMSec;
int tries = 0;
do
{
if (*PtrCurMSec - msecStart >= 200)
{
if (++tries > 5)
{
NoPPFS = TRUE;
printf("\r\nWaitForStatus: time out (1), status = %2.2X\r\n",
usStatus);
LOG_ENTRY(LOG_ENTRY_EXIT | 2);
DUMP_LOG();
return FALSE;
}
msecStart = *PtrCurMSec;
}
usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT);
LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus));
//
// Use SELECTIN to identify the existence of ppsh
//
if (STATUS_IS_DISCONNECTED(usStatus))
{
if (VerifyDisconnect())
{
printf("\r\nWaitForStatus: PPSH disconnected\r\n");
NoPPFS = TRUE;
LOG_ENTRY(LOG_ENTRY_EXIT | 1);
DUMP_LOG();
return FALSE;
}
else
{
usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT);
LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus));
}
}
if ((usStatus & usMask) == usValue)
{
int i;
for (i = 0; i < 2; i++)
{
usStatus = READ_PORT_UCHAR(IoPortBase + PAR_PORT_STAT);
LOG_ENTRY((USHORT)(LOG_ENTRY_STATUS | usStatus));
if ((usStatus & usMask) != usValue)
{
LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_BAD_STATUS);
break;
}
}
}
}
while ((usStatus & usMask) != usValue);
return TRUE;
}
int OEMParallelPortInit(void)
{
LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE);
WRITE_PORT_UCHAR(
IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE);
return TRUE;
}
int OEMParallelPortGetByte(void)
{
BYTE value;
if (NoPPFS)
{
return -1;
}
Retry:
LOG_ENTRY(LOG_ENTRY_READ);
LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_READ | PAR_CTRL_STROBE);
WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_READ | PAR_CTRL_STROBE);
if (!WaitForStatus(PAR_STAT_NACK, PAR_STAT_NACK))
{
return -1;
}
value = READ_PORT_UCHAR(IoPortBase + PAR_PORT_DATA);
LOG_ENTRY((USHORT)(LOG_ENTRY_DATA | value));
LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE);
WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE);
if (!WaitForStatus(PAR_STAT_NACK, 0))
{
return -1;
}
LOG_ENTRY(LOG_ENTRY_EXIT | 0);
if (bLastOpWasWrite && value == 0x1A)
{
//
// There is a problem which I haven't tracked down yet but this works
// around it. The problem is that periodically the first character we
// receive after a write is the last byte sent of the previous write.
//
// For now we will ignore it
//
LOG_ENTRY(LOG_ENTRY_EVENT | LOG_EVENT_SKIP_RECEIVE);
bLastOpWasWrite = FALSE;
goto Retry;
}
bLastOpWasWrite = FALSE;
return value;
}
VOID OEMParallelPortSendByte(BYTE chData)
{
if (NoPPFS)
return;
LOG_ENTRY(LOG_ENTRY_WRITE);
if (!WaitForStatus(PAR_STAT_NBUSY, 0))
{
return;
}
LOG_ENTRY((USHORT)(LOG_ENTRY_DATA | chData));
WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_DATA, chData);
LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED);
WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED);
if (!WaitForStatus(PAR_STAT_NBUSY, PAR_STAT_NBUSY))
{
return;
}
LOG_ENTRY(LOG_ENTRY_CONTROL | PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE);
WRITE_PORT_UCHAR(IoPortBase + PAR_PORT_CTRL, PAR_CTRL_AUTOFEED | PAR_CTRL_STROBE);
LOG_ENTRY(LOG_ENTRY_EXIT | 0);
bLastOpWasWrite = TRUE;
}
#if DEBUG
#define LOG_SIZE 0x1000
#define RW_STACK_SIZE 10
WCHAR wcHexDigits[16] =
{
TEXT('0'), TEXT('1'), TEXT('2'), TEXT('3'),
TEXT('4'), TEXT('5'), TEXT('6'), TEXT('7'),
TEXT('8'), TEXT('9'), TEXT('A'), TEXT('B'),
TEXT('C'), TEXT('D'), TEXT('E'), TEXT('F')
};
USHORT usLogBuffer[LOG_SIZE];
int iLogHead = 0;
int iLogTail = 0;
VOID
LogEntry(USHORT usEntry)
{
static USHORT usLastEntry;
USHORT usEntryType;
USHORT usEntryData;
usEntryData = usEntry & LOG_ENTRY_DATA_MASK;
usEntryType = usEntry & LOG_ENTRY_TYPE_MASK;
switch (usEntryType)
{
case LOG_ENTRY_STATUS:
if (usLastEntry == usEntry)
{
//
// Don't log duplicate status
//
return;
}
break;
case LOG_ENTRY_EVENT:
if (usEntryData < NUMBER_LOG_EVENTS)
{
dwEventCounters[usEntryData]++;
}
break;
}
usLastEntry = usEntry;
usLogBuffer[iLogTail++] = usEntry;
iLogTail %= LOG_SIZE;
if (iLogTail == iLogHead)
{
iLogHead++;
iLogHead %= LOG_SIZE;
}
}
VOID
DumpLog(VOID)
{
// R 00 W 4F
TCHAR szPrintLine[100];
int iLogCurrent;
PTCHAR pCurrentColumn;
int nDataItems;
USHORT usCurrentOp, usLastOp;
int iReadWriteStack[RW_STACK_SIZE];
int i;
pCurrentColumn = szPrintLine;
nDataItems = 0;
usLastOp = 0;
for (i = 0; i < RW_STACK_SIZE; i++)
{
iReadWriteStack[i] = iLogTail;
}
for (iLogCurrent = iLogHead; iLogCurrent != iLogTail;
iLogCurrent++, iLogCurrent %= LOG_SIZE)
{
usCurrentOp = usLogBuffer[iLogCurrent] & LOG_ENTRY_TYPE_MASK;
switch (usCurrentOp)
{
case LOG_ENTRY_READ:
case LOG_ENTRY_WRITE:
if (usLastOp != usCurrentOp)
{
if (pCurrentColumn != szPrintLine)
{
memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n")));
OutputDebugString(szPrintLine);
pCurrentColumn = szPrintLine;
}
*pCurrentColumn++ = (TCHAR)(usLogBuffer[iLogCurrent] >> 8);
*pCurrentColumn++ = TEXT(' ');
usLastOp = usCurrentOp;
nDataItems = 0;
}
for (i = 0; i < (RW_STACK_SIZE - 1); i++)
{
iReadWriteStack[i] = iReadWriteStack[i + 1];
}
iReadWriteStack[RW_STACK_SIZE - 1] = iLogCurrent;
break;
case LOG_ENTRY_EVENT:
case LOG_ENTRY_DATA:
if (nDataItems == 25)
{
memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n")));
OutputDebugString(szPrintLine);
pCurrentColumn = szPrintLine;
*pCurrentColumn++ = TEXT(' ');
*pCurrentColumn++ = TEXT(' ');
nDataItems = 0;
}
*pCurrentColumn++ = wcHexDigits[(usLogBuffer[iLogCurrent] >> 4) & 0x0F];
*pCurrentColumn++ = wcHexDigits[usLogBuffer[iLogCurrent] & 0x0F];
*pCurrentColumn++ = usCurrentOp == LOG_ENTRY_DATA ? TEXT(' ') : TEXT('!');
nDataItems++;
break;
}
}
if (pCurrentColumn != szPrintLine)
{
memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n")));
OutputDebugString(szPrintLine);
pCurrentColumn = szPrintLine;
}
nDataItems = 0;
for (i = 0; i < RW_STACK_SIZE; i++)
{
if (iReadWriteStack[i] != iLogTail)
{
break;
}
}
iLogCurrent = (i < RW_STACK_SIZE) ? iReadWriteStack[i] : iLogTail;
for ( ; iLogCurrent != iLogTail; iLogCurrent++, iLogCurrent %= LOG_SIZE)
{
if (nDataItems == 16)
{
memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n")));
OutputDebugString(szPrintLine);
pCurrentColumn = szPrintLine;
nDataItems = 0;
}
*pCurrentColumn++ = (TCHAR)(usLogBuffer[iLogCurrent] >> 8);
*pCurrentColumn++ = TEXT(' ');
*pCurrentColumn++ = wcHexDigits[(usLogBuffer[iLogCurrent] >> 4) & 0x0F];
*pCurrentColumn++ = wcHexDigits[usLogBuffer[iLogCurrent] & 0x0F];
*pCurrentColumn++ = TEXT(' ');
nDataItems++;
}
if (pCurrentColumn != szPrintLine)
{
memcpy(pCurrentColumn, TEXT("\r\n"), sizeof(TEXT("\r\n")));
OutputDebugString(szPrintLine);
pCurrentColumn = szPrintLine;
}
DumpCounters();
}
VOID
DumpCounters(VOID)
{
int i;
for (i = 0; i < NUMBER_LOG_EVENTS; i++)
{
if (dwEventCounters[i] != 0)
{
NKDbgPrintfW(
TEXT("%s = %d\r\n"), EventDescriptions[i], dwEventCounters[i]);
}
}
}
#endif

View File

View File

@ -1,460 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
ppfs.c
Abstract:
This file implements the NK kernel ppfs client side interface
Notes:
--*/
#include "kernel.h"
/* All strings must be <= 128 bytes including the null termination */
/* Message format: (assume little endians, lower address first>
* -4 0 4 N-1 N N+4
* AA5555AA<header><data><checksum>5AA50A1A
*
* Header format:
* 0 2 4
* <opcode><length>
* lsb msb
*
* Length is 16 bit value. It includes all fields (== N)
* Opcode is 16 bit value. Current values are:
* 0x0000 - boot (AA5555AA00000500FA5AA50A1A)
* 0x0001 - init (AA5555AA01000500F95AA50A1A)
* 0x0002 - open
* 0x0003 - close
* 0x0004 - read
* 0x0005 - write
* 0x0006 - seek
* 0x0007 - delete
* 0x0008 - findfirst
* 0x0009 - findnext
* 0x000A - rRegGet
* 0x000B - rRegOpen
* 0x000C - rRegClose
* 0x000D - rRegEnum
*
*
* Reply to a message will have the same opcode. Bit15 is set to
* indicate transmission failure.
*
* Data is stream of bytes
*
* Checksum is ~(sum of preceding N-1 bytes)
*
* Length of data is <length> - 5
*
*/
CRITICAL_SECTION ppfscs;
extern int NoPPFS; // parallel port not present flag
int read_value(int *chksum) {
int loop;
int result;
BYTE ch;
for (loop = 0; loop < sizeof(int); loop++ ) {
ch = (BYTE)OEMParallelPortGetByte();
*chksum += ch;
((LPBYTE)&result)[loop] = ch;
}
return result;
}
void write_value(int val, int *chksum) {
int loop;
BYTE ch;
for (loop = 0; loop < 4; loop++) {
ch = ((LPBYTE)&val)[loop];
*chksum += ch;
OEMParallelPortSendByte(ch);
}
}
int read_header(int *chksum) {
if (read_value(chksum) != 0xaa5555aa)
return -1;
*chksum = 0;
return read_value(chksum);
}
void write_header(int cmd, int *chksum) {
write_value(0xaa5555aa,chksum);
*chksum = 0;
write_value(cmd,chksum);
}
void read_data(LPBYTE buf, int cnt, int *chksum) {
BYTE ch;
while (cnt--) {
ch = (BYTE)OEMParallelPortGetByte();
*chksum += ch;
*buf++ = ch;
}
}
void write_data(LPBYTE buf, int cnt, int *chksum) {
while (cnt--) {
*chksum += *buf;
OEMParallelPortSendByte(*buf++);
}
}
/* returns TRUE if success, FALSE if failure */
BOOL read_end(int checksum) {
BYTE b;
int tmp;
b = (BYTE)OEMParallelPortGetByte();
if (((checksum & 0xff) != b) ||
(read_value(&tmp) != 0x1a0aa55a))
return FALSE;
return TRUE;
}
void write_end(int checksum) {
int tmp;
BYTE ch = (BYTE)((checksum & 0xff) ^ 0xff);
OEMParallelPortSendByte(ch);
write_value(0x1a0aa55a,&tmp); /* Write out end of message signature */
}
int rlseek(int fd, int off, int mode) {
int chksum, result;
EnterCriticalSection(&ppfscs);
if (NoPPFS)
{
LeaveCriticalSection(&ppfscs);
return -1;
}
write_header(0x00110006,&chksum); /* opcode = 0x0006, length = 17 */
write_value(fd,&chksum);
write_value(off,&chksum);
write_value(mode,&chksum);
write_end(chksum);
if (read_header(&chksum) != 0x00090006) { /* opcode = 0x0006, length = 9 */
LeaveCriticalSection(&ppfscs);
return -1;
}
result = read_value(&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}
int rwriteshort(int fd, char *buf, int cnt) {
int chksum, result;
write_header(0x000d0005+(cnt<<16), &chksum); /* opcode = 0x0005, length = 13 + cnt */
write_value(fd,&chksum);
write_value(cnt,&chksum);
write_data(buf,cnt,&chksum);
write_end(chksum);
if (read_header(&chksum) != 0x00090005) /* opcode = 0x0005, length = 9 */
return -1;
result = read_value(&chksum);
if (!read_end(chksum))
return -1;
return result;
}
int rwrite(int fd, char *buf, int cnt) {
int csize, fullsize;
int result, result2;
char *buf2 = buf;
if (NoPPFS)
return -1;
fullsize = cnt;
LockPages(buf,fullsize,0,0);
EnterCriticalSection(&ppfscs);
result2 = 0;
while (cnt) {
csize = ( cnt > 32*1024L ? 32*1024L : cnt);
if ((result = rwriteshort(fd,buf2,csize)) == -1) {
result2 = -1;
break;
}
result2 += result;
cnt -= csize;
buf2 += csize;
}
LeaveCriticalSection(&ppfscs);
UnlockPages(buf,fullsize);
return result2;
}
int rreadshort(int fd, char *buf, int cnt) {
int chksum, result, size;
write_header(0x000d0004, &chksum); /* opcode = 0x0004, length = 13 */
write_value(fd, &chksum);
write_value(cnt,&chksum);
write_end(chksum);
result = read_header(&chksum);
if ((result & 0xffff) != 0x0004)
return -1;
size = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */
result = read_value(&chksum);
read_data(buf,size,&chksum);
if (!read_end(chksum))
return -1;
return result;
}
int rread(int fd, char *buf, int cnt) {
int csize, fullsize;
int result, result2;
char *buf2 = buf;
if (NoPPFS)
return -1;
fullsize = cnt;
LockPages(buf,fullsize,0,LOCKFLAG_WRITE);
EnterCriticalSection(&ppfscs);
result2 = 0;
while (cnt) {
csize = ( cnt > 32*1024L ? 32*1024L : cnt);
if ((result = rreadshort(fd,buf2,csize)) == -1) {
result2 = -1;
break;
}
result2 += result;
cnt -= csize;
buf2 += csize;
}
LeaveCriticalSection(&ppfscs);
UnlockPages(buf,fullsize);
return result2;
}
int rclose(int fd) {
int chksum, result;
EnterCriticalSection(&ppfscs);
if (NoPPFS) {
LeaveCriticalSection(&ppfscs);
return -1;
}
write_header(0x00090003, &chksum); /* opcode = 0x0003, length = 9 */
write_value(fd,&chksum);
write_end(chksum);
if (read_header(&chksum) != 0x00090003) {
LeaveCriticalSection(&ppfscs);
return -1;
}
result = read_value(&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}
#define MAX_FILENAME_LEN 256
void SC_PPSHRestart(void) {
NoPPFS = 0;
}
int ropen(WCHAR *name, int mode) {
int chksum, result, len;
char fname[MAX_FILENAME_LEN];
len = strlenW(name)+1;
KUnicodeToAscii(fname,name,MAX_FILENAME_LEN);
if (NoPPFS)
return -1;
EnterCriticalSection(&ppfscs);
write_header(0x00090002 + (len<<16), &chksum); /* opcode = 0x0002, length = 9 + strlen + 1 */
write_value(mode,&chksum);
write_data(fname,len,&chksum);
write_end(chksum);
if (read_header(&chksum) != 0x00090002) {
LeaveCriticalSection(&ppfscs);
return -1;
}
result = read_value(&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}
int rfindfirst(DWORD hFind, WCHAR *pattern, struct _finddata_t *fd) {
int chksum, result, len;
char fname[MAX_FILENAME_LEN];
if (NoPPFS)
return -1;
if (pattern != NULL) {
len = strlenW(pattern)+1;
KUnicodeToAscii(fname,pattern,MAX_FILENAME_LEN);
} else {
len = 0;
}
EnterCriticalSection(&ppfscs);
write_header(0x00090008 + (len<<16), &chksum); /* opcode = 0x0002, length = 9 + strlen + 1 */
write_value(hFind,&chksum);
if (len != 0) {
write_data(fname,len,&chksum);
}
write_end(chksum);
result = read_header(&chksum);
if ((result & 0xffff) != 0x0008)
return -1;
len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */
result = read_value(&chksum);
if (len != 0) {
read_data((LPBYTE)fd,len,&chksum);
}
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}
int rfindnext(DWORD hFind, struct _finddata_t *fd) {
int chksum, result, len;
if (NoPPFS)
return -1;
EnterCriticalSection(&ppfscs);
write_header(0x00090009, &chksum); /* opcode = 0x0009, length = 9 */
write_value(hFind,&chksum);
write_end(chksum);
result = read_header(&chksum);
if ((result & 0xffff) != 0x0009)
return -1;
len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */
result = read_value(&chksum);
if (len != 0) {
read_data((LPBYTE)fd,len,&chksum);
}
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}
// Registration database access functions for kernel debug support initialization
int rRegOpen(DWORD hKey, CHAR *szName, LPDWORD lphKey) {
int chksum, len;
if (NoPPFS)
return -1;
len = strlen(szName)+1;
EnterCriticalSection(&ppfscs);
write_header(0x0009000B + (len<<16), &chksum); /* opcode = 0x000B, length = 9 + strlen + 1 */
write_value(hKey,&chksum);
write_data(szName,len,&chksum);
write_end(chksum);
if (read_header(&chksum) != 0x0009000B) {
LeaveCriticalSection(&ppfscs);
return -1;
}
*lphKey = read_value(&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return 0;
}
int rRegClose(DWORD hKey) {
int chksum, result;
if (NoPPFS)
return -1;
EnterCriticalSection(&ppfscs);
write_header(0x0009000C, &chksum); /* opcode = 0x000C, length = 9 */
write_value(hKey,&chksum);
write_end(chksum);
if (read_header(&chksum) != 0x0009000C) {
LeaveCriticalSection(&ppfscs);
return -1;
}
result = read_value(&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}
int rRegGet(DWORD hKey, CHAR *szName, LPDWORD lpdwType,
LPBYTE lpbData, LPDWORD lpdwSize) {
int chksum, result, len;
if (NoPPFS)
return -1;
len = strlen(szName)+1;
EnterCriticalSection(&ppfscs);
write_header(0x0009000A + (len<<16), &chksum); /* opcode = 0x000A, length = 9 + strlen + 1 */
write_value(hKey,&chksum);
write_data(szName,len,&chksum);
write_end(chksum);
DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegGet. hKey=%lu, Name=%a\r\n"), hKey, szName));
result = read_header(&chksum);
if ((result & 0xffff) != 0x000A)
{
LeaveCriticalSection(&ppfscs);
return 0;
}
len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */
*lpdwType = read_value(&chksum);
*lpdwSize = len;
DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegGet. Type=%lu, Size=%lu\r\n"), *lpdwType, *lpdwSize));
read_data(lpbData,len,&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return 0;
}
LeaveCriticalSection(&ppfscs);
return 1;
}
int rRegEnum(DWORD hKey, DWORD dwIndex, LPBYTE lpbData, LPDWORD lpdwSize) {
int chksum, result, len;
if (NoPPFS)
return -1;
EnterCriticalSection(&ppfscs);
write_header(0x000D000D, &chksum); /* opcode = 0x000A, length = 13 */
write_value(hKey,&chksum);
write_value(dwIndex,&chksum);
write_end(chksum);
DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegEnum. hKey=%lu, Index=%u\r\n"), hKey, dwIndex));
result = read_header(&chksum);
if ((result & 0xffff) != 0x000D)
{
LeaveCriticalSection(&ppfscs);
return -1;
}
len = ((result >> 16) & 0xffff) - 9; /* subtract header & chksum */
result = read_value(&chksum);
*lpdwSize = len;
DEBUGMSG(ZONE_DEBUG,(TEXT("NKDBG: RegEnum. Return=%lu, Size=%lu\r\n"), result, *lpdwSize));
read_data(lpbData,len,&chksum);
if (!read_end(chksum)) {
LeaveCriticalSection(&ppfscs);
return -1;
}
LeaveCriticalSection(&ppfscs);
return result;
}

View File

@ -1,14 +0,0 @@
long rlseek(long fd, long off, long mode);
long rwrite(long fd, char *buf, long cnt);
long rread(long fd, char *buf, long cnt);
long rclose(long fd);
long ropen(WCHAR *name, long mode);
long rRegOpen(DWORD hKey, CHAR *szName, LPDWORD lphKey);
long rRegClose(DWORD hKey);
long rRegGet(DWORD hKey, CHAR *szName, LPDWORD lpdwType,
LPBYTE lpbData, LPDWORD lpdwSize);
long rRegEnum(DWORD hKey, DWORD dwIndex, LPBYTE lpbData, LPDWORD lpdwSize);
long rfindfirst(DWORD hFind, WCHAR *pattern, struct _finddata_t *fd);
long rfindnext(DWORD hFind, struct _finddata_t *fd);

View File

@ -1,545 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys\stat.h>
#include <sys\utime.h>
#include <ctype.h>
#include <direct.h>
#include <dos.h>
#include <fcntl.h>
#include <io.h>
#include <time.h>
#include "ppfs.h"
#if DEBUG
VOID DumpCounters(VOID);
#endif
DWORD CurMSec = 0;
DWORD *PtrCurMSec = &CurMSec;
#define COPY_FLAG_UPDATE_EXISTING 0x0001
#define COPY_FLAG_UPDATE_OR_ADD 0x0002
typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */
struct _finddata_t {
unsigned long attrib;
time_t time_create; /* -1 for FAT file systems */
time_t time_access; /* -1 for FAT file systems */
time_t time_write;
_fsize_t size;
char name[260];
};
void
usage2(char *pszProgramPath)
{
char *pszProgramName;
if ((pszProgramName = strrchr(pszProgramPath, '\\')) == NULL)
{
pszProgramName = pszProgramPath;
}
else
{
pszProgramName++;
}
printf(
"%s: Parallel Port FileSystem Tool\n"
"usage: %s -d[:]<pattern> -(g|r|u)[[:]<pattern> [<destination>]\n"
"-d Display a directory of files matching <pattern>.\n\n"
"-g Get files matching <pattern> and copy them to the\n"
" optionally specified <destination>. Any existing file with\n"
" the same name will be overwritten.\n\n"
"-r Refresh files matching <pattern> which already exist in <destination>\n"
" and have a timestamp newer than the one in <destination>.\n\n"
"-u Update files matching <pattern> which don't already exist in\n"
" <destination> or those that have a timestamp newer than those\n"
" in <destination>.\n\n"
"<pattern> Windows filename path with optional wildcard characters.\n\n"
"<destination> If not specified then the current directory is the\n"
" default.\n"
" If specified and it doesn't exist and the last character is \\,\n"
" then the directory is created. Otherwise <destination> is\n"
" treated as the name of the file.\n"
" It is an error for <pattern> to match multiple files\n"
" when <destination> specifies a file.\n",
pszProgramName, pszProgramName);
}
VOID
DisplayDirectory(char *pszPath)
{
DWORD hFind;
struct _finddata_t fd;
struct tm *ptmWrite;
hFind = rfindfirst(0, pszPath, &fd);
if (hFind == 0)
{
printf("%s: No files found\n", pszPath);
}
else if (hFind != -1)
{
do
{
ptmWrite = gmtime(&fd.time_write);
printf(
"%c%c%c%c%c %2.2d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %-8ld %s\n",
fd.attrib & _A_RDONLY ? 'R' : ' ',
fd.attrib & _A_HIDDEN ? 'H' : ' ',
fd.attrib & _A_SYSTEM ? 'S' : ' ',
fd.attrib & _A_SUBDIR ? 'D' : ' ',
fd.attrib & _A_ARCH ? 'A' : ' ',
ptmWrite->tm_mon + 1, ptmWrite->tm_mday, ptmWrite->tm_year,
ptmWrite->tm_hour, ptmWrite->tm_min, ptmWrite->tm_sec,
fd.size, fd.name);
hFind = rfindnext(hFind, &fd);
}
while (hFind != 0 && hFind != -1);
}
if (hFind == -1)
{
printf("%s: Error processing directory\n", pszPath);
}
}
VOID
DrawPercent (DWORD CurValue, DWORD MaxValue)
{
DWORD dwPercent;
static DWORD dwOldPercent = 10000;
if (CurValue == (DWORD)-1) {
dwOldPercent = 10000;
fprintf(stderr, "%s ", MaxValue);
return;
}
dwPercent = (CurValue*100)/MaxValue;
if ((dwPercent / 5) != (dwOldPercent / 5))
{
fprintf(stderr, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
for (dwOldPercent=0; dwOldPercent < (dwPercent/5); dwOldPercent++)
{
fprintf(stderr, "%c", 219);
}
for (; dwOldPercent < 20; dwOldPercent++)
{
fprintf(stderr, "%c", 176);
}
dwOldPercent = dwPercent;
fprintf(stderr, " %2d%%", dwPercent);
}
else
{
fprintf(stderr, "\b\b\b%2d%%", dwPercent);
}
}
BOOL
GetOneFile(
char *pszSourceFile, char *pszDestinationFile,
DWORD dwFileSize, time_t tmModify)
{
int hDestinationFile;
DWORD hSourceFile;
int nReadCount;
static char cReadBuffer[16384];
DWORD dwBytesWritten;
printf("%s --> %s\n", pszSourceFile, pszDestinationFile);
hDestinationFile = _open(
pszDestinationFile, _O_WRONLY | _O_CREAT | _O_BINARY | _O_TRUNC,
_S_IREAD | _S_IWRITE);
if (hDestinationFile == -1)
{
printf(
"%s: Error opening file for write access, error = %d\n",
pszDestinationFile, errno);
return FALSE;
}
hSourceFile = ropen(pszSourceFile, _O_RDONLY);
if (hSourceFile == -1)
{
_close(hDestinationFile);
printf("%s: Error opening file for read access\n", pszSourceFile);
return FALSE;
}
// Initialize the percent thingie.
DrawPercent((DWORD)-1, (DWORD)"");
dwBytesWritten = 0;
for ( ; ; )
{
nReadCount = (int)rread(hSourceFile, &cReadBuffer[0], sizeof(cReadBuffer));
if (nReadCount <= 0)
{
break;
}
_write(hDestinationFile, cReadBuffer, nReadCount);
dwBytesWritten += nReadCount;
DrawPercent(dwBytesWritten, dwFileSize);
}
fprintf(stderr, "\r \r");
rclose(hSourceFile);
_close(hDestinationFile);
if (nReadCount == 0)
{
struct _utimbuf utDestination;
time_t tmNow;
time(&tmNow);
utDestination.actime = tmNow;
utDestination.modtime = tmModify != 0 ? tmModify : tmNow;
_utime(pszDestinationFile, &utDestination);
}
else
{
_unlink(pszDestinationFile);
}
return nReadCount == 0;
}
BOOL
CheckDestination(char *pszDestination, char **ppszDirEnd)
{
struct _stat stDestination;
BOOL bIsDir;
*ppszDirEnd = strrchr(pszDestination, '\\');
if (*ppszDirEnd == NULL && pszDestination[1] == ':')
{
*ppszDirEnd = &pszDestination[1];
}
if (*ppszDirEnd == NULL)
{
*ppszDirEnd = pszDestination;
}
else
{
(*ppszDirEnd)++;
}
bIsDir = FALSE;
if (pszDestination[strlen(pszDestination)-1] == '\\')
{
pszDestination[strlen(pszDestination)-1] = '\0';
bIsDir = TRUE;
}
if (_stat(pszDestination, &stDestination) == 0)
{
if (stDestination.st_mode & _S_IFDIR)
{
bIsDir = TRUE;
}
}
else if (bIsDir)
{
if (_mkdir(pszDestination) == -1)
{
printf("%s: Error creating directory, error = %d\n", pszDestination, errno);
}
}
if (bIsDir)
{
*ppszDirEnd = &pszDestination[strlen(pszDestination)];
if (*ppszDirEnd[-1] != '\\')
{
*(*ppszDirEnd)++ = '\\';
}
}
return bIsDir;
}
VOID
GetFile(char *pszSource, char *pszDestination, USHORT usCopyFlags)
{
DWORD hFind;
struct _stat stDestination;
char szDestinationFile[_MAX_PATH];
char *pDestinationDirEnd;
struct _finddata_t fdSource;
char szSourceFile[_MAX_PATH];
char *pSourceDirEnd;
BOOL bDestinationIsDir;
int nFilesCopied = 0;
BOOL bDestinationExists;
BOOL bDoCopy;
pSourceDirEnd = strrchr(pszSource, '\\');
if (pSourceDirEnd == NULL && pszSource[1] == ':')
{
pSourceDirEnd = &pszSource[1];
}
if (pSourceDirEnd != NULL)
{
int nDirLength = pSourceDirEnd - pszSource + 1;
memcpy(szSourceFile, pszSource, nDirLength);
pSourceDirEnd = &szSourceFile[nDirLength];
}
else
{
pSourceDirEnd = szSourceFile;
}
hFind = rfindfirst(0, pszSource, &fdSource);
if (hFind == 0 || hFind == -1)
{
printf("%s: File(s) not found\n", pszSource);
return;
}
if (pszDestination != NULL)
{
strcpy(szDestinationFile, pszDestination);
bDestinationIsDir = CheckDestination(szDestinationFile, &pDestinationDirEnd);
}
else
{
pDestinationDirEnd = szDestinationFile;
bDestinationIsDir = TRUE;
}
do
{
strcpy(pSourceDirEnd, fdSource.name);
if (bDestinationIsDir)
{
strcpy(pDestinationDirEnd, fdSource.name);
}
bDoCopy = TRUE;
if (usCopyFlags & (COPY_FLAG_UPDATE_EXISTING | COPY_FLAG_UPDATE_OR_ADD))
{
bDestinationExists = _stat(szDestinationFile, &stDestination) == 0;
if (bDestinationExists)
{
//
// Clear lsb of both times so inaccurate FATFS doesn't cause
// problems
//
stDestination.st_mtime &= ~1;
fdSource.time_write &= ~1;
if (stDestination.st_mtime >= fdSource.time_write)
{
printf("%s: Up to date\n", szDestinationFile);
bDoCopy = FALSE;
}
}
else if (!(usCopyFlags & COPY_FLAG_UPDATE_OR_ADD))
{
printf("%s: Skipping\n", szSourceFile);
bDoCopy = FALSE;
}
}
if (bDoCopy)
{
if (GetOneFile(szSourceFile, szDestinationFile, fdSource.size, fdSource.time_write))
{
nFilesCopied++;
}
else
{
break;
}
}
hFind = rfindnext(hFind, &fdSource);
if (!bDestinationIsDir && hFind != 0 && hFind != -1)
{
printf(
"%s: Destination isn't a directory and multiple files selected\n",
szDestinationFile);
break;
}
}
while (hFind != 0 && hFind != -1);
if (hFind != 0 && hFind != -1)
{
rfindfirst(hFind, NULL, NULL);
}
printf("%d files copied\n", nFilesCopied);
}
int
main2(int argc, char **argv)
{
char cOption;
int i;
int OEMParallelPortInit(void);
//
// Keep timezone conversions from getting in our way. All of the responses
// from the host are in local time anyways.
//
_daylight = 0;
_timezone = 0;
OEMParallelPortInit();
for (i = 1; i < argc; i++)
{
if (argv[i][0] == '-' || argv[i][0] == '/')
{
cOption = tolower(argv[i][1]);
switch (cOption)
{
case '?':
case 'h':
usage2(argv[0]);
break;
case 'd':
{
char *pszPath;
if (argv[i][2] != '\0')
{
pszPath = &argv[i][2];
if (*pszPath == ':')
{
pszPath++;
}
}
else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/')
{
pszPath = argv[i+1];
i++;
}
else
{
pszPath = "*.*";
}
DisplayDirectory(pszPath);
}
break;
case 'g':
case 'r':
case 'u':
{
char *pszSource;
char *pszDestination;
if (argv[i][2] != '\0')
{
pszSource = &argv[i][2];
if (*pszSource == ':')
{
pszSource++;
}
}
else if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/')
{
pszSource = argv[i+1];
i++;
}
else
{
printf("Error source path missing\n");
break;
}
if (argc > (i+1) && argv[i+1][0] != '-' && argv[i+1][0] != '/')
{
pszDestination = argv[i+1];
i++;
}
else
{
pszDestination = NULL;
}
GetFile(
pszSource, pszDestination,
cOption == 'r' ? COPY_FLAG_UPDATE_EXISTING :
cOption == 'u' ? COPY_FLAG_UPDATE_OR_ADD :
0);
}
break;
default:
printf("%s: Unsupported option\n\n", argv[i]);
usage2(argv[0]);
}
}
}
#if DEBUG
DumpCounters();
#endif
return 0;
}

View File

@ -1,7 +0,0 @@
REM set __MSVCDIR=\\robertko\msvc15
set __MSVCDIR=e:\msvc15
set PATH=%__MSVCDIR%\bin;%PATH%;%_WINCEROOT%\sdk\bin\i386
set MSDevDir=%__MSVCDIR%
set lib=%__MSVCDIR%\lib
set include=%__MSVCDIR%\include

View File

@ -1,182 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
smchw.h
Abstract:
Definitions for the SMC9000 registers
Notes:
--*/
#ifndef _SMCHW_H
#define _SMCHW_H
// These registers are in Bank 0 at the given offsets from the base address
// Since they are set up for 32-bit accesses, the offsets are multiplied by 2 from
// the numbers given in the SMC91C94 spec.
#define TCR_REG 0
#define EPHSTATUS_REG 2
#define RCR_REG 4
#define COUNTER_REG 6
#define MIR_REG 8
#define MCR_REG 10
// The register at offset 24 is reserved
// The bank select register is the same for all 4 banks
#define BANKSEL_REG 14
// Bank 1 registers
#define CONFIG_REG 0
#define BASE_REG 2
#define MACADDR_REG0 4
#define MACADDR_REG1 6
#define MACADDR_REG2 8
#define GENERAL_REG 10
#define CONTROL_REG 12
// Bank 2 _REGisters
#define MMUCOMMAND_REG 0
#define PNR_ARR_REG 2
#define FIFOPORTS_REG 4
#define POINTER_REG 6
#define DATA_REG 8
#define AUXDATA_REG 10
#define INTERRUPT_REG 12
#define INTERRUPT_MASK_REG 13
// Bank 3 registers
#define MULTITAB_REG0 0
#define MULTITAB_REG1 2
#define MULTITAB_REG2 4
#define MULTITAB_REG3 6
#define MGMT_REG 8
#define REVISION_REG 10
#define ERCV_REG 12
// These values are written to the bank select register to change banks.
#define BANK0 0x3300
#define BANK1 0x3301
#define BANK2 0x3302
#define BANK3 0x3303
// EPH Status reg (also used for TX status word)
#define EPH_UNDERRUN 0x8000 // Frame uderrun
#define EPH_LINKERROR 0x4000 // 10BASET link error condition
#define EPH_RXOVERRUN 0x2000 // Receiver overrun
#define EPH_COUNTER 0x1000 // Counter roll over
#define EPH_EXDEFER 0x0800 // Excessive deferral
#define EPH_CARRIER 0x0400 // Carrier not present
#define EPH_LATE 0x0200 // Late collision
#define EPH_DEFER 0x0080 // Frame was deferred
#define EPH_BCAST 0x0040 // Last frame was broadcast
#define EPH_SQET 0x0020 // Signal Quality Error
#define EPH_16COL 0x0010 // Too many collisions
#define EPH_MCAST 0x0008 // Last frame was multicast
#define EPH_MULTICOL 0x0004 // Multiple collisions on last frame
#define EPH_1COL 0x0002 // Single collision on last frame
#define EPH_TX_OK 0x0001 // Frame successfully transmitted
// MMU Commands
#define CMD_NOP 0 // No-Op command
#define CMD_ALLOC 0x0020 // Allocate memory
#define CMD_RESET 0x0040 // Reset MMU to initial state
#define CMD_REM_TOP 0x0060 // Remove frame from top of RX fifo
#define CMD_REM_REL_TOP 0x0080 // Remove and release top of RX fifo
#define CMD_REL_SPEC 0x00a0 // Release specific packet
#define CMD_ENQ_TX 0x00c0 // Enqueue to xmit fifo
#define CMD_ENQ_RX 0x00e0 // Reset xmit fifos (should only be done
// with transmitter disabled)
#define MMU_CMD_BUSY 0x0001 // MMU busy, don't modify PNR
// Allocation Result Register (low byte of PNR_ARR_REG)
#define ARR_FAIL 0x80 // Allocation failed
#define ARR_ALLOC_MSK 0x7f // Mask allocated packet number
// Actually 1fh but use full mask for
// upward compatibility.
// Pointer Register (POINTER_REG)
#define PTR_RCV 0x8000 // Access is to receive area
#define PTR_AUTO 0x4000 // Auto-increment on access
#define PTR_READ 0x2000 // =1 then read operation
// =0 then write operation
#define PTR_ETEN 0x1000 // Detect early transmit underrun
#define PTR_NOT_EMPTY 0x0800 // Write fifo not empty
#define PTR_OFFSET 0x03ff // Mask pointer value
// Fifo Ports Register (FIFOPORTS_REG)
#define FIFO_EMPTY 0x80 // No packet at top of fifo
#define FIFO_TX_PKT_MASK 0x7f // Mask top packet number
// Actually 1fh but use full mask for
// upward compatibility.
// Interrupt flags that can be set/acknowledged
#define ERCV_INT 0x0040
#define EPH_INT 0x0020
#define RX_OVRN_INT 0x0010
#define ALLOC_INT 0x0008
#define TXEMPTY_INT 0x0004
#define TX_INT 0x0002
#define RCV_INT 0x0001
// Interrupt mask bits, if these are set the interrupt is enabled
#define ERCV_INTM 0x4000
#define EPH_INTM 0x2000
#define RX_OVRN_INTM 0x1000
#define ALLOC_INTM 0x0800
#define TXEMPTY_INTM 0x0400
#define TX_INTM 0x0200
#define RCV_INTM 0x0100
// This value is used to intialize the Control Register (Pg 49 of the SMC91C94 spec):
// Bit 14 - RCV_BAD - Don't receive Frames with bad CRC
// Bit 13 - PWRDN - Don't go into power down mode
// Bit 11 - AUTO RELEASE - Do use the auto memory release feature for successfully transmitted Frames
// Bit 7 - LE ENABLE - Don't generate interrupts for link errors (merged through EPH_INT)
// Bit 6 - CR ENABLE - Don't generate interrupts for counter roll over (merged through EPH_INT)
// Bit 5 - TE ENABLE - Do generate interrupts for transmit errors (merged through EPH_INT)
// Bit 2 - EEPROM SELECT - Don't select the EEPROM
// Bit 1 - RELOAD - Don't reload EEPROM data
// Bit 0 - STORE - Don't store EEPROM data
#define CONTROL_REG_INIT 0x0920
// This value is used to intialize the Transmit Control Register (Pg 35 of the SMC91C94 spec):
// Bit 13 - EPH LOOP - Don't do EPH Internal Loopback
// Bit 12 - STP SQET - Don't stop transmission on SQET error
// DANGER - May need FDUPLX for IPX
// Bit 11 - FDUPLX - Don't use full duplex operation so that Frames sourced by this card are not received by it
// Bit 10 - MON_CSN - Don't monitor carrier while transmitting. Transmission will continue whether the card senses
// it's own carrier after the preamble or not.
// Bit 8 - NOCRC - Do insert the CRC at the end of transmitted frames automatically
// Bit 7 - PAD_EN - Do pad frames shorter than the minimum of 64 bytes automatically
// Bit 2 - FORCOL - Don't force a collision
// Bit 1 - LOOP - Don't loop back frames internally without transmitting
// Bit 0 - TXENA - Do enable transmission
#define TCR_REG_INIT 0x0081
// This value is used to initialize the Memory Configuration Register (Pg 42 of the SMC91C94 spec):
// Bits 7-0 - MEMORY RESERVED FOR TRANSMIT - Reserve memory for transmit purposes only. I need to
// reserve enough memory for one maximum sized Frame for transmission purposes. This will prevent
// deadlock conditions in which Frames keep coming in, but can't be acknowledged because of a lack of memory.
// The amount of memory reserved is calculated as MCR_REG_INIT * 256 * M, where M is 1 for the 91C94
// (pg 42 of the SMC91C94 spec.). So, for a 1500 byte frame, I need 1500 / 256 = 6 memory pages.
#define MCR_REG_INIT 0x0006
// This value is used to initialize the Receive Control Register (Pg 39 of the SMC91C94 spec):
// Bit 15 - SOFT RST - Don't do a soft reset
// Bit 14 - FILT_CAR - Don't filter the carrier signal
// Bit 9 - STRIP CRC - Don't strip the CRC from the Frame
// Bit 8 - RXEN - Do enable the Frame receiver
// Bit 2 - ALMUL - Don't accept all multicast frames
// Bit 1 - PRMS - Don't go into promiscuous mode
// Bit 0 - RX_ABORT - Write the receive abort flag low
// (set by a frame that was longer than 1532 bytes or out of buffer memory error)
#define RCR_REG_INIT 0x0100
#endif // _SMCHW_H

View File

@ -1,205 +0,0 @@
;***********************************************************************************************************
;
; Init.Asm - Boot Loader initialization code for x86 PC.
;
; Author: RBN
;
; Written 5/1/96
;
;***********************************************************************************************************
.486p
OpPrefix MACRO
db 66h
ENDM
_TEXT SEGMENT WORD PUBLIC USE16 'CODE'
FLAT_STACK_SIZE EQU 4000h
db FLAT_STACK_SIZE dup ( 0 )
FLAT_STACK_START equ $
;
; This static GDT contains 2 selectors - A flat code selector, and a flat data selector.
;
GDT_Data LABEL DWORD
db 0, 0, 0, 0, 0, 0, 0, 0 ; First GDT entry always unused
CS_FLAT_SEL EQU ($-GDT_Data)
db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b, 00h ; Code
DS_FLAT_SEL EQU ($-GDT_Data)
db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b, 00h ; Data
GDT_TABLE_SIZE = $ - OFFSET GDT_Data
;
; Limit + Pointer to the GDT
;
GDTPtr LABEL FWORD
dw GDT_TABLE_SIZE - 1 ; Limit of 0 = 1 byte
dd OFFSET GDT_Data
PModeEntrySeg dw SEG InPModeNow
PModeEntryOff dd OFFSET InPModeNow
;******************************************************************************
;
; Launch
;
; At this point, we are running in a 16-bit code segment.
; Since this code is written in a 16-bit code segment, we need to put an
; OpPrefix in front of all 32-bit instructions.
;
; This function jumps to InPModeNow to force CS to be reloaded with a
; valid PMode selector.
;
;******************************************************************************
Launch PROC NEAR C PUBLIC
cli ; Make sure we don't get any more interrupts
mov al, 0FFh ; Disable all PIC interrupts
out 021h, al
if 0
mov dx, 003FBh
mov al, 080h ; Access Baud Divisor
out dx, al
dec dx ; 3FAh
dec dx ; 3F9h
dec dx ; 3F8h
mov al, 002h ; 57600 Baud
out dx, al
inc dx ; 3F9h
xor al, al
out dx, al
inc dx ; 3FAh
inc dx ; 3FBh
mov al, 003h ; DLAB = 0, 8 bit, no parity
out dx, al
dec dx ; 3FAh
dec dx ; 3F9h
xor al, al ; No interrupts, polled
out dx, al
inc dx ; 3FAh
mov al, 001h ; Enable FIFO if present
out dx, al
inc dx ; 3FBh
inc dx ; 3FCh
mov al, 003h ; Assert DTR, RTS
out dx, al
mov dx, 03FDh
@@:
in al, dx ; Get Modem status
test al, 020h
jz @B
mov al, 'A'
mov dx, 03F8h
out dx, al
endif
;
; Since we were loaded by the DOS 16bit real-mode loader we need to
; manually relocate all references to linear addresses before we switch
; to protect mode.
;
xor ebx, ebx ; Clear upper word
mov bx, cs ; Our segment
shl ebx, 4 ; Convert segment to linear address
mov eax, DWORD PTR [GDTPtr + 2]
add eax, ebx
mov DWORD PTR [GDTPtr + 2], eax
xor eax, eax
mov ax, [PModeEntrySeg]
shl eax, 4
add eax, [PModeEntryOff]
mov [PModeLbl], eax
pop ax ; Remove return address from stack
pop edx ; Load entry point from arguments
pop esi ; Linear address of arguments
OpPrefix
lgdt FWORD PTR [GDTPtr] ; Load the GDTR
mov ecx, OFFSET FLAT_STACK_START
add ecx, ebx
;
; Don't need OpPrefix on mov to/from CR0 -- It's always 32-bit
;
mov eax, cr0 ; Get the current CR0
or al, 1 ; Set the PE bit to enable protected mode
mov cr0, eax ; NOW WE'RE IN PMODE!
OpPrefix
db 0EAh ; Far jump forces a selector lookup
PModeLbl dd 0
dw CS_FLAT_SEL
Launch ENDP
_TEXT ENDS
_TEXT32 SEGMENT WORD PUBLIC USE32 'CODE32'
;***********************************************************************************************************
;
; InPModeNow
;
; This function is responsible for setting up the data selectors and the stack and then jumping to main.
;
;***********************************************************************************************************
InPModeNow PROC NEAR
mov eax, DS_FLAT_SEL
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
mov esp, ecx
push edx
mov edx, 001FFFFCh
mov dword ptr [edx], esi ; Save linear ptr to args in known location
if 0
mov dx, 03FDh
@@:
in al, dx ; Get Modem status
test al, 020h
jz @B
mov al, 'B'
mov dx, 03F8h
out dx, al
endif
ret ; Jump to entry point
InPModeNow ENDP
_TEXT32 ENDS
END

View File

@ -1,146 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#include <string.h>
#include "loadcepc.h"
#include "video.h"
#define VESAMODE480x200x256 0x101 /* VESA Mode 101 - 480x200x256 emulated in 640x480 */
#define VESAMODE640x480x256 0x101 /* VESA Mode 101 - 640x480x256 */
#define VESAMODE800x600x256 0x103 /* VESA Mode 103 - 800x600x256 */
#define VESAMODE1024x768x256 0x105 /* VESA Mode 105 - 1024x768x256 */
#define VESASCANLENGTH1024 1024 /* These VESA modes have the same scan length */
void mode320x200x256(void)
{
/*
** Put the display into 320x200x256 colour mode and clear it
*/
__asm
{
mov ah, 0 ; Set video mode
mov al, 013h ; 320x200x256 and clear screen
int 10h ; set mode 13
}
}
int isVesaSupported(void)
{
VESA_GENERAL_INFO vesaInfo, far *pVesaInfo = &vesaInfo;
__asm
{
mov ax, 04F00h ; Get VESA info
les di, pVesaInfo ; Pointer to info buffer
int 10h ; check for VESA
cmp ax, 0004Fh ; Was it successful?
jne noVesa
}
return TRUE;
noVesa:
return FALSE;
}
int setVesaMode(int vesaMode, int scanLength)
{
__asm
{
mov ax, 04F02h ; VESA Set mode
mov bx, vesaMode ; Set given VESA Mode
int 10h ;
cmp ax, 0004Fh ; Was it successful?
jne failed
mov ax, 04F06h ; VESA Set logical scan line length
mov bl, 0
mov cx, scanLength ; Set so banks are an integral number lines
int 10h ; set VESA scan length
cmp ax, 0004Fh ; Was it successful?
jne failed
}
return TRUE;
failed:
return FALSE;
}
/* SetVideoMode: maps from the user input 0-X to a VESA mode
** User VESA MODE
** Input
** 0 320x200x256 default mode, should work with any video card with 64K memory
** 1 480x240x256 non-standard VGA resolution, emulated in a 640x480 window.
** 2 640x480x256
** 3 800x600x256
** 4 1024x768x256
** 5 320x240x256 non-standard VGA resolution, emulated in a 640x480 window.
*/
UCHAR SetVideoMode(UCHAR desiredMode)
{
int vesaMode = 0;
int scanLength = VESASCANLENGTH1024;
if (desiredMode == 0)
{
/* In the default mode, there is no need to bank switch the card since only 64K required */
/* VESA is NOT required for this mode. */
goto defaultMode;
}
if (isVesaSupported())
{
/* Use VESA to put the video card into the appropriate mode */
switch (desiredMode)
{
case 0x01: /* 480x240x256 is emulated in a partial 640x480x256 screen */
case 0x02:
case 0x05: /* 240x320x256 is emulated in a partial 640x480x256 screen */
scanLength = VESASCANLENGTH1024; /* scan length for this mode */
vesaMode = VESAMODE640x480x256; /* VESA Mode 101 - 640x480x256 */
break;
case 0x03:
scanLength = VESASCANLENGTH1024; /* scan length for this mode */
vesaMode = VESAMODE800x600x256; /* VESA Mode 103 - 800x600x256 */
break;
case 0x04:
scanLength = VESASCANLENGTH1024; /* scan length for this mode */
vesaMode = VESAMODE1024x768x256; /* VESA Mode 105 - 1024x768x256 */
break;
default:
goto defaultMode;
break;
}
/* OK, setup the video card */
if (setVesaMode(vesaMode, scanLength))
{
return desiredMode; /* Successful setting of VESA mode */
}
}
defaultMode:
mode320x200x256();
return 0;
}

View File

@ -1,27 +0,0 @@
#pragma pack(1)
typedef struct _VESA_GENERAL_INFO
{
UCHAR szSignature[4];
WORD wVersion;
UCHAR far * pszVendor;
DWORD dwCapabilities;
WORD far * pModeList;
WORD wTotalMemory;
UCHAR ucReserved[236];
} VESA_GENERAL_INFO;
typedef struct _VESA_MODE_INFO
{
WORD wModeAttributes;
UCHAR ucWindowAAttributes;
UCHAR ucWindowBAttributes;
WORD wWindowGranularity;
WORD wWindowSize;
WORD wWindowASegment;
WORD wWindowBSegment;
DWORD pWindowSchemeFunction;
WORD wBytesPerScanLine;
UCHAR ucReserved[238];
} VESA_MODE_INFO;
#pragma pack()

View File

@ -1,7 +0,0 @@
int __cdecl _inp(unsigned);
int __cdecl _outp(unsigned, int);
#pragma intrinsic(_inp, _outp)
#define READ_PORT_UCHAR(a) _inp((unsigned)a)
#define WRITE_PORT_UCHAR(a, b) _outp((unsigned)a, (int)b)

View File

@ -1,30 +0,0 @@
#include <stdio.h>
#include <string.h>
typedef struct _CRITICAL_SECTION
{
int iDummy;
} CRITICAL_SECTION, *LPCRITICAL_SECTION;
typedef unsigned long DWORD, *LPDWORD;
typedef unsigned long BOOL;
typedef char CHAR;
typedef unsigned char BYTE, *LPBYTE, UCHAR, *PUCHAR;
typedef unsigned short USHORT, *PUSHORT;
#define FALSE 0
#define TRUE 1
#define TEXT
#define VOID void
#define WCHAR char
#define TCHAR char
#define PTCHAR char *
#define strlenW strlen
#define OutputDebugString printf
#define NKDbgPrintfW printf
#define EnterCriticalSection(a)
#define LeaveCriticalSection(a)

View File

@ -1,408 +0,0 @@
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998 Microsoft Corporation
Module Name:
Abstract:
Functions:
Notes:
--*/
#include "xmsapi.h"
#pragma warning(disable:4704)
#pragma pack(1)
typedef struct _EXTENDED_MEMORY_MOVE
{
unsigned long ulLength;
unsigned int uiSourceHandle;
unsigned long ulSourceOffset;
unsigned int uiDestinationHandle;
unsigned long ulDestinationOffset;
} EXTENDED_MEMORY_MOVE, *PEXTENDED_MEMORY_MOVE;
#pragma pack()
int (far * XMSControl)() = 0;
struct
{
int iErrorCode;
char * pszErrorString;
}
XmsErrorMessages[] =
{
{ XMS_SUCCESS, "Success" },
{ XMS_E_NOT_IMPLEMENTED, "Not implemented" },
{ XMS_E_VDISK_DETECTED, "VDISK detected" },
{ XMS_E_A20_ERROR, "A20 error" },
{ XMS_W_NO_HMA, "No HMA" },
{ XMS_W_HMA_IN_USE, "HMA in use" },
{ XMS_W_HMA_DENIED, "HMA denied" },
{ XMS_W_HMA_NOT_ALLOCATED, "HMA not allocated" },
{ XMS_W_A20_STILL_ENABLED, "A20 still enabled" },
{ XMS_S_NO_FREE_EXTENDED_MEMORY, "No free extended memory" },
{ XMS_S_NO_FREE_HANDLES, "No free handles" },
{ XMS_S_INVALID_HANDLE, "Invalid handle" },
{ XMS_S_INVALID_SOURCE_HANDLE, "Invalid source handle" },
{ XMS_S_INVALID_SOURCE_OFFSET, "Invalid source offset" },
{ XMS_S_INVALID_DESTINATION_HANDLE, "Invalid destination handle" },
{ XMS_S_INVALID_DESTINATION_OFFSET, "Invalid destination offset" },
{ XMS_S_INVALID_LENGTH, "Invalid length" },
{ XMS_S_INVALID_OVERLAP, "Invalid overlap" },
{ XMS_S_PARITY_ERROR, "Parity error" },
{ XMS_S_BLOCK_LOCKED, "Block locked" },
{ XMS_S_HANDLE_LOCKED, "Handle locked" },
{ XMS_S_LOCK_COUNT_OVERFLOW, "Lock count overflow" },
{ XMS_S_LOCK_FAILED, "Lock failed" },
{ XMS_I_SMALLER_UMB_AVAILABLE, "Smaller UMB available" },
{ XMS_I_NO_UMBS_AVAILABLE, "No UMBs available" },
{ XMS_I_INVALID_UMB_SEGMENT, "Invalid UMB segment" }
};
#define N_XMS_ERROR_MESSAGES (sizeof(XmsErrorMessages) / sizeof(XmsErrorMessages[0]))
int
XmsIsInstalled()
{
int bInstalled = 0;
if (XMSControl != 0)
{
return 1;
}
_asm
{
mov ax,4300h ; Check if XMS is present)
int 2Fh
xor ah,ah
cmp al,80h
jne done ; Nope - no point in continuing
mov ax,4310h ; Get XMS entry point
int 2Fh
mov WORD PTR [XMSControl], bx ; Save entry point
mov WORD PTR [XMSControl + 2], es
inc bInstalled ; Indicate installed
}
done:
return bInstalled;
}
int
XmsLocalEnableA20()
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 05h
call [XMSControl]
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
int
XmsLocalDisableA20()
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 06h
call [XMSControl]
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
int
XmsQueryA20(
int *pbEnabled)
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 07h
call [XMSControl]
push si
mov si, pbEnabled
mov WORD PTR [si], ax
pop si
xor bh, bh
mov xmsError, bx
}
return xmsError;
}
int
XmsQueryFreeExtendedMemory(
unsigned int *puiLargestFreeBlock,
unsigned int *puiTotalFree)
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 08h
call [XMSControl]
push si
mov si, puiLargestFreeBlock
mov WORD PTR [si], ax
mov si, puiTotalFree
mov WORD PTR [si], dx
pop si
xor bh, bh
mov xmsError, bx
}
return xmsError;
}
int
XmsAllocateExtendedMemory(
unsigned int uiBlockSizeK,
unsigned int * puiBlockHandle)
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 09h
mov dx, uiBlockSizeK
call [XMSControl]
push si
mov si, puiBlockHandle
mov WORD PTR [si], dx
pop si
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
int
XmsFreeExtendedMemory(
unsigned int uiBlockHandle)
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 0Ah
mov dx, uiBlockHandle
call [XMSControl]
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
int
XmsMoveExtendedMemory(
unsigned int uiSourceHandle,
unsigned long ulSourceOffset,
unsigned int uiDestinationHandle,
unsigned long ulDestinationOffset,
unsigned long ulLength)
{
EXTENDED_MEMORY_MOVE moveInfo;
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
moveInfo.uiSourceHandle = uiSourceHandle;
moveInfo.ulSourceOffset = ulSourceOffset;
moveInfo.uiDestinationHandle = uiDestinationHandle;
moveInfo.ulDestinationOffset = ulDestinationOffset;
moveInfo.ulLength = ulLength;
_asm
{
mov ah, 0Bh
push si
lea si, moveInfo
call [XMSControl]
pop si
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
int
XmsLockExtendedMemory(
unsigned int uiBlockHandle,
unsigned long * pulLinearAddress)
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 0Ch
mov dx, uiBlockHandle
call [XMSControl]
push si
mov si, pulLinearAddress
mov WORD PTR [si], bx
mov WORD PTR [si + 2], dx
pop si
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
int
XmsUnlockExtendedMemory(
unsigned int uiBlockHandle)
{
int xmsError = XMS_SUCCESS;
if (!XmsIsInstalled())
{
return XMS_E_NOT_IMPLEMENTED;
}
_asm
{
mov ah, 0Dh
mov dx, uiBlockHandle
call [XMSControl]
clc
rcr al, 1
jc done
xor bh, bh
mov xmsError, bx
}
done:
return xmsError;
}
char *XmsErrorString(int xmsError)
{
int i;
for (i = 0; i < N_XMS_ERROR_MESSAGES; i++)
{
if (XmsErrorMessages[i].iErrorCode == xmsError)
{
return XmsErrorMessages[i].pszErrorString;
}
}
return "Unknown error";
}

View File

@ -1,62 +0,0 @@
#define XMS_SUCCESS 0x00
#define XMS_E_NOT_IMPLEMENTED 0x80
#define XMS_E_VDISK_DETECTED 0x81
#define XMS_E_A20_ERROR 0x82
#define XMS_W_NO_HMA 0x90
#define XMS_W_HMA_IN_USE 0x91
#define XMS_W_HMA_DENIED 0x92
#define XMS_W_HMA_NOT_ALLOCATED 0x93
#define XMS_W_A20_STILL_ENABLED 0x94
#define XMS_S_NO_FREE_EXTENDED_MEMORY 0xA0
#define XMS_S_NO_FREE_HANDLES 0xA1
#define XMS_S_INVALID_HANDLE 0xA2
#define XMS_S_INVALID_SOURCE_HANDLE 0xA3
#define XMS_S_INVALID_SOURCE_OFFSET 0xA4
#define XMS_S_INVALID_DESTINATION_HANDLE 0xA5
#define XMS_S_INVALID_DESTINATION_OFFSET 0xA6
#define XMS_S_INVALID_LENGTH 0xA7
#define XMS_S_INVALID_OVERLAP 0xA8
#define XMS_S_PARITY_ERROR 0xA9
#define XMS_S_BLOCK_LOCKED 0xAA
#define XMS_S_HANDLE_LOCKED 0xAB
#define XMS_S_LOCK_COUNT_OVERFLOW 0xAC
#define XMS_S_LOCK_FAILED 0xAD
#define XMS_I_SMALLER_UMB_AVAILABLE 0xB0
#define XMS_I_NO_UMBS_AVAILABLE 0xB1
#define XMS_I_INVALID_UMB_SEGMENT 0xB2
int XmsIsInstalled();
int XmsLocalEnableA20();
int XmsLocalDisableA20();
int XmsQueryA20(
int *pbEnabled);
int XmsQueryFreeExtendedMemory(
unsigned int *puiLargestFreeBlock, unsigned int *puiTotalFree);
int XmsAllocateExtendedMemory(
unsigned int uiBlockSizeK, unsigned int * puiBlockHandle);
int XmsFreeExtendedMemory(
unsigned int uiBlockHandle);
int XmsMoveExtendedMemory(
unsigned int uiSourceHandle, unsigned long ulSourceOffset,
unsigned int uiDestinationHandle, unsigned long ulDestinationOffset,
unsigned long ulLength);
int XmsLockExtendedMemory(
unsigned int uiBlockHandle,
unsigned long * pulLinearAddress);
int XmsUnlockExtendedMemory(
unsigned int uiBlockHandle);
char *XmsErrorString();

View File

@ -1,20 +0,0 @@
c:\users\351\documents\visual studio 2017\projects\cec20\release\about.ipdb
c:\users\351\documents\visual studio 2017\projects\cec20\release\about.iobj
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.pch
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\vc141.pdb
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\pch.obj
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\aboutdlg.obj
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.obj
c:\users\351\documents\visual studio 2017\projects\cec20\release\about.exe
c:\users\351\documents\visual studio 2017\projects\cec20\release\about.pdb
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.res
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\about.write.1u.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\cl.command.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\cl.read.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\cl.write.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\link.command.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\link.read.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\link.write.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\rc.command.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\rc.read.1.tlog
c:\users\351\documents\visual studio 2017\projects\cec20\about\release\about.tlog\rc.write.1.tlog

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,2 +0,0 @@
#TargetFrameworkVersion=v4.0:PlatformToolSet=v141_xp:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=7.0
Release|Win32|C:\Users\351\Documents\Visual Studio 2017\Projects\cec20\|

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,107 +0,0 @@

// about.cpp: 定义应用程序的类行为。
//
#include "pch.h"
#include "framework.h"
#include "about.h"
#include "aboutDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CaboutApp
BEGIN_MESSAGE_MAP(CaboutApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// CaboutApp 构造
CaboutApp::CaboutApp()
{
// 支持重新启动管理器
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的 CaboutApp 对象
CaboutApp theApp;
// CaboutApp 初始化
BOOL CaboutApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
// 激活“Windows Native”视觉管理器以便在 MFC 控件中启用主题
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CaboutDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
}
// 删除上面创建的 shell 管理器。
if (pShellManager != nullptr)
{
delete pShellManager;
}
#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
ControlBarCleanUp();
#endif
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}

View File

@ -1,32 +0,0 @@

// about.h: PROJECT_NAME 应用程序的主头文件
//
#pragma once
#ifndef __AFXWIN_H__
#error "include 'pch.h' before including this file for PCH"
#endif
#include "resource.h" // 主符号
// CaboutApp:
// 有关此类的实现,请参阅 about.cpp
//
class CaboutApp : public CWinApp
{
public:
CaboutApp();
// 重写
public:
virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP()
};
extern CaboutApp theApp;

Binary file not shown.

View File

@ -1,221 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{1839CDDC-A7DA-4657-81A3-AF3F799C97F7}</ProjectGuid>
<Keyword>MFCProj</Keyword>
<RootNamespace>about</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Static</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="about.h" />
<ClInclude Include="aboutDlg.h" />
<ClInclude Include="framework.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="about.cpp" />
<ClCompile Include="aboutDlg.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="about.rc" />
</ItemGroup>
<ItemGroup>
<None Include="res\about.rc2" />
</ItemGroup>
<ItemGroup>
<Image Include="E:\Desktop\background - 副本 (2).bmp" />
<Image Include="res\about.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="about.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="aboutDlg.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="framework.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="pch.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="about.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="aboutDlg.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="about.rc">
<Filter>资源文件</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<None Include="res\about.rc2">
<Filter>资源文件</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Image Include="res\about.ico">
<Filter>资源文件</Filter>
</Image>
<Image Include="E:\Desktop\background - 副本 (2).bmp">
<Filter>资源文件</Filter>
</Image>
</ItemGroup>
</Project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<RESOURCE_FILE>about.rc</RESOURCE_FILE>
</PropertyGroup>
</Project>

View File

@ -1,89 +0,0 @@

// aboutDlg.cpp: 实现文件
//
#include "pch.h"
#include "framework.h"
#include "about.h"
#include "aboutDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CaboutDlg 对话框
CaboutDlg::CaboutDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_ABOUT_DIALOG, pParent)
{
//m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CaboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CaboutDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()
// CaboutDlg 消息处理程序
BOOL CaboutDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CaboutDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CaboutDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

View File

@ -1,33 +0,0 @@

// aboutDlg.h: 头文件
//
#pragma once
// CaboutDlg 对话框
class CaboutDlg : public CDialogEx
{
// 构造
public:
CaboutDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUT_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

View File

@ -1,17 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 about.rc 使用
//
#define IDD_ABOUT_DIALOG 102
#define IDB_BITMAP1 130
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 131
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1002
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -1,8 +0,0 @@
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\Win32\PlatformToolsets\v141_xp\Toolset.targets(39,5): warning MSB8051: 面向 Windows XP 的支持已被弃用,将来的 Visual Studio 版本不再提供该支持。请访问 https://go.microsoft.com/fwlink/?linkid=2023588获取详细信息。
pch.cpp
menu2.cpp
menu2Dlg.cpp
正在生成代码
All 233 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
已完成代码的生成
menu2.vcxproj -> C:\Users\351\Documents\Visual Studio 2017\Projects\cec20\Release\menu2.exe

Binary file not shown.

View File

@ -1,49 +0,0 @@
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的
// 关闭 MFC 的一些常见且经常可放心忽略的隐藏警告消息
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
#include <afxdisp.h> // MFC 自动化类
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // MFC 支持功能区和控制条
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

View File

@ -1,5 +0,0 @@
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。

View File

@ -1,13 +0,0 @@
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#endif //PCH_H

View File

@ -1,8 +0,0 @@
#pragma once
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h并将
// 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h>

1
WNT/menu2.exe/CECD0.20 Normal file
View File

@ -0,0 +1 @@
Build2553 - 5RC2

104
WNT/menu2.exe/DigHelp.cpp Normal file
View File

@ -0,0 +1,104 @@
// DigHelp.cpp: 实现文件
//
#include "pch.h"
#include "menu2.h"
#include "DigHelp.h"
#include "afxdialogex.h"
// DigHelp 对话框
IMPLEMENT_DYNAMIC(DigHelp, CDialogEx)
DigHelp::DigHelp(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG1, pParent)
{
}
DigHelp::~DigHelp()
{
}
void DigHelp::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC1, m_text1);
}
BEGIN_MESSAGE_MAP(DigHelp, CDialogEx)
ON_BN_CLICKED(IDOK, &DigHelp::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &DigHelp::OnBnClickedCancel)
ON_BN_CLICKED(IDC_BUTTON1, &DigHelp::OnBnClickedButton1)
END_MESSAGE_MAP()
// DigHelp 消息处理程序
void DigHelp::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
}
void DigHelp::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnCancel();
}
int beforeNum = 0;
TCHAR lpPath_[255] = { 0 };
void DigHelp::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
int maxInfo = GetPrivateProfileInt(L"sug", L"maxInfo", -1, lpPath_);
TCHAR currentInfo[255] = { 0 };
srand(time(0));
int curNum = 0;
do {
curNum = rand() % maxInfo; // 生成随机数
} while (curNum==beforeNum);
beforeNum = curNum;
TCHAR currentID[255] = { 0 };
wsprintf(currentID, L"%d", curNum);
GetPrivateProfileString(L"sug", currentID, NULL, currentInfo, 255, lpPath_);
m_text1.SetWindowText(currentInfo);
}
BOOL DigHelp::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
ShowWindow(SW_NORMAL);
CRect rtDesk;
CRect rtDlg;
::GetWindowRect(::GetDesktopWindow(), &rtDesk);
GetWindowRect(&rtDlg);
int iXpos = rtDesk.Width() / 2 - rtDlg.Width() / 2;
int iYpos = rtDesk.Height() / 2 - rtDlg.Height() / 2;
SetWindowPos(NULL, iXpos, iYpos, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
GetCurrentDirectory(MAX_PATH, lpPath_);
wsprintf(lpPath_, L"%s\\menu.enus", lpPath_);
int maxInfo = GetPrivateProfileInt(L"sug", L"maxInfo", -1, lpPath_);
TCHAR currentInfo[255] = { 0 };
srand(time(0));
int randomNum = rand()%maxInfo; // 生成随机数
beforeNum = randomNum;
TCHAR currentID[255] = { 0 };
wsprintf(currentID, L"%d", randomNum);
GetPrivateProfileString(L"sug", currentID, NULL, currentInfo, 255, lpPath_);
m_text1.SetWindowText(currentInfo);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

29
WNT/menu2.exe/DigHelp.h Normal file
View File

@ -0,0 +1,29 @@
#pragma once
// DigHelp 对话框
class DigHelp : public CDialogEx
{
DECLARE_DYNAMIC(DigHelp)
public:
DigHelp(CWnd* pParent = nullptr); // 标准构造函数
virtual ~DigHelp();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG1 };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
afx_msg void OnBnClickedButton1();
virtual BOOL OnInitDialog();
CStatic m_text1;
};

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +1,10 @@
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\menu2.pch
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\vc141.pdb
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\pch.obj
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\menu2dlg.obj
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\menu2.obj
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\dighelp.obj
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\menu2.pch
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\pch.obj
c:\users\351\documents\visual studio 2017\projects\cec20\menu2\release\about.obj
c:\users\351\documents\visual studio 2017\projects\cec20\release\menu2.exe
c:\users\351\documents\visual studio 2017\projects\cec20\release\menu2.pdb
c:\users\351\documents\visual studio 2017\projects\cec20\release\menu2.ipdb

View File

@ -1,7 +1,7 @@
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Platforms\Win32\PlatformToolsets\v141_xp\Toolset.targets(39,5): warning MSB8051: 面向 Windows XP 的支持已被弃用,将来的 Visual Studio 版本不再提供该支持。请访问 https://go.microsoft.com/fwlink/?linkid=2023588获取详细信息。
正在生成代码
0 of 201 functions ( 0.0%) were compiled, the rest were copied from previous compilation.
0 of 260 functions ( 0.0%) were compiled, the rest were copied from previous compilation.
0 functions were new in current compilation
0 functions had inline decision re-evaluated but remain unchanged
已完成代码的生成
about.vcxproj -> C:\Users\351\Documents\Visual Studio 2017\Projects\cec20\Release\about.exe
menu2.vcxproj -> C:\Users\351\Documents\Visual Studio 2017\Projects\cec20\Release\menu2.exe

Binary file not shown.

Binary file not shown.

Binary file not shown.

102
WNT/menu2.exe/about.cpp Normal file
View File

@ -0,0 +1,102 @@
// about.cpp: 实现文件
//
#include "pch.h"
#include "menu2.h"
#include "about.h"
#include "afxdialogex.h"
// about 对话框
IMPLEMENT_DYNAMIC(about, CDialogEx)
about::about(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_ABOUT_DIALOG, pParent)
{
}
about::~about()
{
}
void about::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATICVER, m_textver);
}
BEGIN_MESSAGE_MAP(about, CDialogEx)
ON_BN_CLICKED(IDOK, &about::OnBnClickedOk)
END_MESSAGE_MAP()
// about 消息处理程序
void about::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
}
TCHAR* AsciiToUnicode(char *str)
{
DWORD dwNum = 0;
dwNum = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
TCHAR* pwHostName = new TCHAR[dwNum];
MultiByteToWideChar(CP_ACP, 0, str, -1, pwHostName, dwNum);
return pwHostName;
}
TCHAR lpPath__[255] = { 0 };
BOOL about::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
ShowWindow(SW_NORMAL);
CRect rtDesk;
CRect rtDlg;
::GetWindowRect(::GetDesktopWindow(), &rtDesk);
GetWindowRect(&rtDlg);
int iXpos = rtDesk.Width() / 2 - rtDlg.Width() / 2;
int iYpos = rtDesk.Height() / 2 - rtDlg.Height() / 2;
SetWindowPos(NULL, iXpos, iYpos, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
wsprintf(lpPath__, L"..\\CECD0.20");
HANDLE hFile = CreateFile(
lpPath__, // 文件名
GENERIC_READ, // 读权限
0, // 不共享
NULL, // 安全属性
OPEN_EXISTING, // 打开已存在的文件
FILE_ATTRIBUTE_NORMAL, // 文件属性
NULL // 模板文件的句柄
);
if (hFile == INVALID_HANDLE_VALUE) {
MessageBox(L"ERROR");
return 1;
}
// 确定文件大小
DWORD dwFileSize = GetFileSize(hFile, NULL);
// 分配内存读取文件
char buffer[255] = { 0 };
DWORD dwRead = 0;
// 读取文件内容
if (ReadFile(hFile, buffer, dwFileSize, &dwRead, NULL)) {
buffer[dwFileSize] = '\0'; // 添加字符串终止符
}
// 关闭文件句柄
CloseHandle(hFile);
m_textver.SetWindowText(AsciiToUnicode(buffer));
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

27
WNT/menu2.exe/about.h Normal file
View File

@ -0,0 +1,27 @@
#pragma once
// about 对话框
class about : public CDialogEx
{
DECLARE_DYNAMIC(about)
public:
about(CWnd* pParent = nullptr); // 标准构造函数
virtual ~about();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUT_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
virtual BOOL OnInitDialog();
CStatic m_textver;
};

View File

@ -188,6 +188,8 @@
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="about.h" />
<ClInclude Include="DigHelp.h" />
<ClInclude Include="framework.h" />
<ClInclude Include="menu2.h" />
<ClInclude Include="menu2Dlg.h" />
@ -196,6 +198,8 @@
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="about.cpp" />
<ClCompile Include="DigHelp.cpp" />
<ClCompile Include="menu2.cpp" />
<ClCompile Include="menu2Dlg.cpp" />
<ClCompile Include="pch.cpp">
@ -212,8 +216,11 @@
<None Include="res\menu2.rc2" />
</ItemGroup>
<ItemGroup>
<Image Include="E:\Desktop\background - 副本 (2).bmp" />
<Image Include="E:\Desktop\background2.bmp" />
<Image Include="res\background.bmp" />
<Image Include="res\flag.bmp" />
<Image Include="res\info.ico" />
<Image Include="res\menu2.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@ -33,6 +33,12 @@
<ClInclude Include="pch.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="DigHelp.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="about.h">
<Filter>头文件</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="menu2.cpp">
@ -44,6 +50,12 @@
<ClCompile Include="pch.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="DigHelp.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="about.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="menu2.rc">
@ -65,5 +77,14 @@
<Image Include="res\background.bmp">
<Filter>资源文件</Filter>
</Image>
<Image Include="res\info.ico">
<Filter>资源文件</Filter>
</Image>
<Image Include="res\flag.bmp">
<Filter>资源文件</Filter>
</Image>
<Image Include="E:\Desktop\background - 副本 (2).bmp">
<Filter>资源文件</Filter>
</Image>
</ItemGroup>
</Project>

View File

@ -7,6 +7,8 @@
#include "menu2.h"
#include "menu2Dlg.h"
#include "afxdialogex.h"
#include "DigHelp.h"
#include "about.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@ -93,6 +95,10 @@ BOOL Cmenu2Dlg::OnInitDialog()
MyExpandTree(m_tree.GetRootItem());
DigHelp *dlg = new DigHelp;
dlg->Create(IDD_DIALOG1, NULL);
dlg->ShowWindow(SW_SHOWNORMAL);//SW_SHOW是对话框的显示方式
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
@ -208,6 +214,11 @@ void Cmenu2Dlg::OnNMClickSyslink2(NMHDR *pNMHDR, LRESULT *pResult)
void Cmenu2Dlg::OnNMClickSyslink3(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
doCommand(L".\\about.exe", NULL);
//doCommand(L".\\about.exe", NULL);
about *dlg = new about;
dlg->Create(IDD_ABOUT_DIALOG, NULL);
dlg->ShowWindow(SW_SHOWNORMAL);//SW_SHOW是对话框的显示方式
*pResult = 0;
}

View File

@ -9,5 +9,7 @@
// 添加要在此处预编译的标头
#include "framework.h"
#include <afxcontrolbars.h>
#include <afxcontrolbars.h>
#endif //PCH_H

Some files were not shown because too many files have changed in this diff Show More