Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

290 lines
8.8 KiB

/*
** Copyright(c) Microsoft Corp., 1991, 1992
*/
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <atpap.h>
#define EVENT_READ 0
#define EVENT_WRITE 1
#define NUM_WAIT_EVENTS 2
/* main()
*/
_CRTAPI1 main() {
DWORD idEvent ;
PAP_IO_STATUS_BLOCK ioStatusRead ;
CHAR pReadBuffer[PAP_DEFAULT_BUFFER] ;
PAP_IO_STATUS_BLOCK ioStatusWrite ;
CHAR pWriteBuffer[PAP_DEFAULT_BUFFER] ;
HANDLE hAddress ;
HANDLE hJob ;
HANDLE hReadFile ;
DWORD cbReadFromReadFile ;
HANDLE hDumpFile ;
DWORD cbWriteToDumpFile ;
HANDLE ahWaitEvents[NUM_WAIT_EVENTS] ;
NBP_NAME nbpnPrinter ;
BOOLEAN fEof ;
//
// connect to a printer
//
strcpy (nbpnPrinter.ObjectName, "Sloth ") ;
strcpy (nbpnPrinter.TypeName, "LaserWriter") ;
strcpy (nbpnPrinter.ZoneName, "CORP-01/1") ;
if (!PapOpenAddress(&hAddress)) {
printf("ERROR: unable to open address, rc=%lx\n", GetLastError()) ;
return 1;
}
if (!PapConnect(&hJob, hAddress, &nbpnPrinter, 0xffffffff)) {
printf("ERROR: unable to connect to printer, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
return 1;
}
//
// open the data file
//
if ((hReadFile = CreateFile(
"outfile.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE) {
printf("ERROR: unable to open data file, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
return 1;
}
//
// open the dump file
//
if ((hDumpFile = CreateFile(
"infile.txt",
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE) {
printf("ERROR: unable to open dump file, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
return 1;
}
//
// initialize events
//
if ((ahWaitEvents[EVENT_READ] = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
printf("ERROR: unable to create READ event, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(hDumpFile) ;
return 1;
}
if ((ahWaitEvents[EVENT_WRITE] = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
printf("ERROR: unable to create WRITE event, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
}
//
// post the first read
//
if (!PapRead(
hJob,
pReadBuffer,
PAP_DEFAULT_BUFFER,
&ioStatusRead,
ahWaitEvents[EVENT_READ])) {
printf("ERROR: unable to post first PapRead, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
//
// post the first write
//
if (!ReadFile(
hReadFile,
pWriteBuffer,
PAP_DEFAULT_BUFFER,
&cbReadFromReadFile,
NULL)) {
printf("ERROR: first file read fails with rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
if (!PapWrite(
hJob,
pWriteBuffer,
cbReadFromReadFile,
FALSE,
&ioStatusWrite,
ahWaitEvents[EVENT_WRITE],
0)) {
printf("ERROR: unable to post first PapWrite, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
while (TRUE) {
idEvent = WaitForMultipleObjects(NUM_WAIT_EVENTS, ahWaitEvents, FALSE, 5000) ;
switch (idEvent) {
case EVENT_READ:
if (!NT_SUCCESS(ioStatusRead.Status)) {
printf("ERROR: read completes with failure code %lx\n", ioStatusRead.Status) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
//
// dump the read buffer
//
printf("MSG FROM PRINTER: %s\n", pReadBuffer) ;
if (!WriteFile(
hDumpFile,
pReadBuffer,
ioStatusRead.Information & 0x7fffffff,
&cbWriteToDumpFile,
NULL)) {
printf("ERROR: unable to dump printer message to file\n") ;
}
//
// post another read
//
if (!PapRead(
hJob,
pReadBuffer,
PAP_DEFAULT_BUFFER,
&ioStatusRead,
ahWaitEvents[EVENT_READ])) {
printf("ERROR: unable to post PapRead, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
break ;
case EVENT_WRITE:
if (!NT_SUCCESS(ioStatusWrite.Status)) {
printf("ERROR: write completes with failure code %lx\n", ioStatusWrite.Status) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
//
// get another buffer of data
//
if (!ReadFile(
hReadFile,
pWriteBuffer,
PAP_DEFAULT_BUFFER,
&cbReadFromReadFile,
NULL)) {
printf("ERROR: file read fails with rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
//
// post another write
//
if (cbReadFromReadFile == 0) {
fEof = TRUE ;
} else {
fEof = FALSE ;
}
if (!PapWrite(
hJob,
pWriteBuffer,
cbReadFromReadFile,
fEof,
&ioStatusWrite,
ahWaitEvents[EVENT_WRITE],
0)) {
printf("ERROR: unable to post PapWrite, rc=%lx\n", GetLastError()) ;
PapCloseAddress(hAddress) ;
PapCloseJob(hJob) ;
CloseHandle(hReadFile) ;
CloseHandle(ahWaitEvents[EVENT_READ]) ;
CloseHandle(ahWaitEvents[EVENT_WRITE]) ;
CloseHandle(hDumpFile) ;
return 1;
}
if (fEof) return 0 ;
break ;
default:
printf("timeout or error on WaitForMultipleObjects\n") ;
}
}
}