Практически невозможно построить содержательную программу, которая бы не использовала ввод и вывод данных. И ввод и вывод данных в современных операционных системах требует применения внутренних средств, внутренних функций ОС. Все более-менее полноценные ОС в качестве средства доступа к внутренним функциям используют не программные прерывания (как это делала MS-DOS и подобные ей), а обращения к внутренним функциям ОС, оформленным с точки зрения доступа к ним как подпрограммы, вызываемые стандартными машинными командами.
Совершенно обязательной системной функцией, используемой абсолютно любой программой при ее завершении, является системная функция завершения. В операционной системе MS Windows эта функция имеет имя ExitProcess.
Функция завершения ExitProcess требует только одного аргумента, который задает значение кода возврата. Этот аргумент может принимать любое выбранное программистом значение. Вызов функции ExitProcess на языке Си описывается прототипом
VOIDExitProcess(UINT result),
где аргумент задает код возврата, который передается в программу, запустившую данную. В частности, если программа, делающая вызов ExitProcess, запускалась из командной строки, код возврата передается в командную оболочку операционной системы.
Даже для простейших программ необходимо иметь возможность ввода-вывода данных. Наиболее общим средством для этого служат стандартные файлы. Стандартный файл ввода после запуска программы, если он не был явно переназначен, берет данные с клавиатуры. Стандартный файл вывода автоматически назначается на экран.
Для использования системных функций ввода и вывода в программах необходимо иметь хэндл (handle), который обозначает условным логическим номером дескриптор (описатель) файла, необходимый для организации операций с файлом. В ОС MS Windows хэндлы стандартных файлов непосредственно недоступны, но для получения этих хэндлов, которые отличны от 0, 1 и 2, нужно выполнить специальные запросы к ОС. При использовании же стандартных файлов требуются лишь системные функции чтения из файла и записи в файл. В современных операционных системах эти функции сделаны универсальными и предназначены для работы не только со стандартными файлами, но и с обычными файлами, а также для иных операций ввода-вывода.
Прототип системной функции чтения из файла в MS Windows описывается на языке Си в следующем виде
BOOL WINAPI ReadFile(HANDLE hFile, LPVOID Buffer, DWORD len,
LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
где все аргументы 4-байтовые, причем первый из них задает хэндл (для наших ближайших целей – хэндл файла), второй определяет место (буфер) для считываемых данных, третий задает число байтов, которые запрашиваются для ввода, четвертый – возвращаемый параметр – определяет после выполнения системной функции, сколько байтов было действительно прочитано. Последний аргумент имеет достаточно специальное значение и нашем изложении не будет использоваться, для чего его значение будет задаваться как NULL. Число прочитанных байтов может быть меньше числа запрошенных, если при чтении обнаружен конец файла.
Прототип системной функции записи в файл описывается в виде
BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID Buffer, DWORD len,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
где все аргументы также 4-байтовые, причем первый из них задает хэндл, второй указывает место (буфер) записываемых данных, третий задает сколько байтов следует записать при вводе, а четвертый – возвращаемый параметр – определяет сколько байтов было действительно записано. Последний аргумент также использоваться не будет, и его значение всегда будет полагаться NULL.
Для получения хэндлов стандартного файла ввода-вывода в MS Windows предназначена системная функция GetStdHandle, имеющая следующий прототип
HANDLE GetStdHandle(DWORD nStdHandle);
где аргумент используется обычно в виде символической константы, определенной в заголовочном файле winbase.h следующими тремя значениями