|
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;
}
|