Figure 1 Windows NT 4.0 Cryptography Functions
Context Functions
CryptAcquireContextA/W
CryptReleaseContext 
CryptSetProvParam 
CryptGetProvParam 
CryptSetProviderA/W
Key Generation Functions
CryptGenKey 
CryptDeriveKey 
Data Encryption Functions
CryptEncrypt 
CryptDecrypt 
Key Exchange Functions
CryptDestroyKey 
CryptSetKeyParam 
CryptGetKeyParam 
CryptExportKey 
CryptImportKey 
CryptGenRandom 
CryptGetUserKey 
Hashing and Signature Functions
CryptSetHashParam 
CryptGetHashParam 
CryptCreateHash 
CryptHashData 
CryptHashSessionKey 
CryptGetHashValue 
CryptDestroyHash 
CryptSignHashA/W 
CryptVerifySignatureA/W 
Figure 2 New Windows NT 4.0 Shell Interfaces
| IExtractIconA/W | ICommDlgBrowser | 
| IShellLinkA/W | IContextMenu2 | 
| ICopyHookA/W | IPersistFolder | 
| IFileViewerA/W | IShellIcon | 
| IShellView | IShellExecuteHookA/W | 
| IShellView2 | INewShortcutHookA/W | 
| IShellBrowser | 
Figure 3 WSOCK32.DLL Forwarded Routines
Forwarded to WS2_32.DLL
accept 
bind 
closesocket 
getpeername 
getsockname 
htonl 
htons
ioctlsocket 
listen 
ntohl 
ntohs 
recv 
recvfrom 
select 
send 
sendto 
shutdown 
WSAAsyncSelect 
WSAGetLastError 
WSASetLastError 
__WSAFDIsSet 
Forwarded to MSWSOCK32.DLL
TransmitFile
AcceptEx
GetAcceptExSockaddrs 
Figure 4 WinInet Functions
General-purpose WinInet Functions
InternetOpen 
InternetConnect
InternetOpenUrl 
InternetReadFile
InternetCloseHandle
InternetSetStatusCallback 
InternetQueryOption 
InternetSetOption 
InternetFindNextFile (FTP and Gopher) 
WinInet HTTP Functions
HttpOpenRequest 
HttpAddRequestHeaders 
HttpSendRequest 
HttpQueryInfo 
WinInet FTP Functions
FtpFindFirstFile 
FtpGetFile 
FtpPutFile 
FtpDeleteFile 
FtpRenameFile 
FtpOpenFile 
InternetWriteFile 
FtpCreateDirectory
FtpRemoveDirectory 
FtpSetCurrentDirectory 
FtpGetCurrentDirectory 
FtpCommand 
InternetGetLastResponseInfo 
WinInet Gopher Functions
GopherFindFirstFile
GopherOpenFile 
GopherCreateLocator 
GopherGetAttribute 
Figure 5 HINTERNET Subtypes
| INTERNET_HANDLE_TYPE_INTERNET | 1 | 
| INTERNET_HANDLE_TYPE_CONNECT_FTP | 2 | 
| INTERNET_HANDLE_TYPE_CONNECT_GOPHER | 3 | 
| INTERNET_HANDLE_TYPE_CONNECT_HTTP | 4 | 
| INTERNET_HANDLE_TYPE_FTP_FIND | 5 | 
| INTERNET_HANDLE_TYPE_FTP_FIND_HTML | 6 | 
| INTERNET_HANDLE_TYPE_FTP_FILE | 7 | 
| INTERNET_HANDLE_TYPE_FTP_FILE_HTML | 8 | 
| INTERNET_HANDLE_TYPE_GOPHER_FIND | 9 | 
| INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML | 10 | 
| INTERNET_HANDLE_TYPE_GOPHER_FILE | 11 | 
| INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML | 12 | 
| INTERNET_HANDLE_TYPE_HTTP_REQUEST | 13 | 
Figure 6 IMAGEHLP Functions
Image integrity functions
ImageGetDigestStream 
ImageAddCertificate 
ImageRemoveCertificate 
ImageEnumerateCertificates 
ImageGetCertificateData 
ImageGetCertificateHeader
Image modification functions
BindImage 
BindImageEx 
CheckSumMappedFile 
MapFileAndCheckSum 
ReBaseImage 
RemovePrivateCvSymbolic 
RemoveRelocations 
SplitSymbols 
UpdateDebugInfoFile 
UpdateDebugInfoFileEx 
TouchFileTimes 
Image access functions
ImageLoad 
ImageUnload 
ImageNtHeader 
ImageDirectoryEntryToData 
ImageRvaToSection 
ImageRvaToVa 
MapAndLoad 
GetImageConfigInformation 
GetImageUnusedHeaderBytes 
SetImageConfigInformation 
UnMapAndLoad 
FindExecutableImage 
GetTimestampForLoadedLibrary 
Symbol table functions
SymSetOptions 
SymGetOptions 
SymCleanup 
SymEnumerateModules 
SymEnumerateSymbols 
EnumerateLoadedModules 
SymFunctionTableAccess 
SymGetModuleInfo 
SymGetModuleBase 
SymGetSymFromAddr 
SymGetSymFromName 
SymGetSymNext 
SymGetSymPrev 
SymInitialize 
SymGetSearchPath 
SymSetSearchPath 
SymLoadModule 
SymUnloadModule 
SymUnDName 
SymRegisterCallback 
Debugger helper functions
StackWalk 
FindDebugInfoFile
FindExecutableImage
MapDebugInformation
UnmapDebugInformation
UnDecorateSymbolName
Miscellaneous functions
ImagehlpApiVersion 
ImagehlpApiVersionEx 
SearchTreeForFile 
MakeSureDirectoryPathExists 
Figure A SETCURS.CPP
 //======================================================
// SETCURS.EXE - Matt Pietrek 1996
// Microsoft Systems Journal, August 1996
// FILE: SETCURS.CPP
// To compile: CL SETCURS.CPP USER32.LIB
//======================================================
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#define ITERATIONS 5000
int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance,
                    PSTR lpszCmdLine, int nCmdShow )
{
    HCURSOR hCursor;
    
    hCursor = GetCursor();
    // Bump up the thread's priority temporarily so that we don't get
    // randomly interrupted.
    SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL );
    // We're going to cheat here, and use the support of 64 bit integers.
    // With some typecasting, we can fool the compiler into believe that
    // they're really LARGE_INTEGER structs.
    unsigned __int64 beginTime64, endTime64, ticksPerSecond;
    // Get the initial tick count
    QueryPerformanceCounter( (LARGE_INTEGER *)&beginTime64 );
    // The purpose of this program...
    for ( unsigned i = 0; i < ITERATIONS; i++ )
    {
        SetCursor( hCursor );
    }
    // Get the final tick count
    QueryPerformanceCounter( (LARGE_INTEGER *)&endTime64 );
    
    // Be a good Win32 citizen and put the priority back.
    SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_NORMAL );
    DWORD ticks = (DWORD)(endTime64 - beginTime64) ;
    // Find out how many ticks occur per second
    QueryPerformanceFrequency( (LARGE_INTEGER *)&ticksPerSecond );
    
    char szOutText[128];
    // Spit out how many calls would be made in one second
    wsprintf( szOutText, "%u calls/sec\n",
              (DWORD)((ticksPerSecond / ticks) * ITERATIONS) );
    MessageBox( 0, szOutText, "SETCURS", MB_OK );
        
    return 0;Figure B FIBER.CPP
 //======================================================
// FIBER.EXE - Matt Pietrek 1996
// Microsoft Systems Journal, August 1996
// FILE: FIBER.CPP
// To compile: CL FIBER.CPP (must have NT 4.0 Win32 SDK)
//======================================================
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <stdio.h>
LPVOID lpFiber1;        // Addresses of each fiber that's created
LPVOID lpFiber2;
LPVOID lpFiber3;
LPVOID lpFiberMain;
void WINAPI FiberRoutine( LPVOID param )
{
    printf( "In fiber %u\n", param ); // Tell the world who we are
    
    if ( 1 == (DWORD)param )
        SwitchToFiber( lpFiber2 );      // fiber1 -> fiber2
    else if ( 2 == (DWORD)param )
        SwitchToFiber( lpFiber3 );      // fiber2 -> fiber3
    else if ( 3 == (DWORD)param )
        SwitchToFiber( lpFiberMain );   // fiber3->main fiber (original
                                        // thread)
}
int main()
{
    // Create 3 fibers, with starting addresses of the above routine
    lpFiber1 = CreateFiber( 16384, FiberRoutine, (PVOID)1 );
    lpFiber2 = CreateFiber( 16384, FiberRoutine, (PVOID)2 );
    lpFiber3 = CreateFiber( 16384, FiberRoutine, (PVOID)3 );
    if ( !lpFiber1 || !lpFiber2 || !lpFiber3 )  // Make sure the fibers were
        return 0;                               // created
    
    // Make this thread a fiber, so that it can force the other fibers to run
    lpFiberMain = ConvertThreadToFiber( 0 );
    // Sleep for 1 second, just to prove that the other
    printf( "Sleeping for 1 second\n" );
    Sleep( 1000 );
    
    printf( "Switching to first fiber\n" );
    SwitchToFiber( lpFiber1 );                  // Switch to fiber1
    printf( "Returning from SwitchToFiber\n" );
    DeleteFiber( lpFiber1 );    // Clean up the 3 fibers we created earlier
    DeleteFiber( lpFiber2 );
    DeleteFiber( lpFiber3 );
        
    return 0;
}