MDRSESCO – Software for the Masses


All the software described herein was designed and implemented by MARK DANA ROCKMAN   Email:  usermark at mdrsesco dot biz. 



BigDigitClock displays the current time-of-day.  This seems trivial, but at a radio station, with three analog clocks, that are supposed to be synchronized with a GPS time-source, but aren’t, this app fills a void.  Together with the KeepClockUpdated daemon, BigDigitClock let’s announcers know when to begin speaking at the start of a live broadcast.




MERGE finds corresponding files in two directory trees and merges them into a third directory.

Some files may appear in one directory but not the other.  These are sent to the output directory.  Those files that appear in both directories are compared to learn which one of the two is the more recent.  The more recent one is sent to the output directory.

MERGE is handy when you maintain several separate but related collections of files, organized into directories and sub-directories.  It sometimes becomes convenient to combine collections through de-duplication.




CopyMaster is an app that allows you to duplicate the latest directory structures and files so they appear on two different computers at the same time.  This redundancy has two advantages.  First, there is a current backup copy of your important files.  Second, there is convenience in being able to find all your favorite stuff on at least two different computers.


How You Work It

Map the A: drive to \\ComputerOne\C$ and the B: drive to \\ComputerTwo\C$.  Then launch CopyMaster.  When CopyMaster finishes doing what it does do, you’ll have two computers that sport nearly identical contents (ignoring the operating system and extra software files). 

You can create a $.txt file in the C:\Users\Public\$$$DeleteMe directory that instructs CopyMaster to get rid of unwanted directories on both computers.




Suppose you have a directory that contains a florid tree of sub-directories along with files at many levels and you want to be rid of the whole mess.

Windows has a rule that says you may not delete a read-only file.  This prevents you from deleting a directory that contains a read-only file.

Deltree: to the rescue.  Just point Deltree at the root of the mess and it’s gone in three shakes of a lamb’s tail.

Now try doing that with the del or erase command in the ordinary Windows shell.  Oh.  It will do something.   But it won’t do what you want.



WAVConcatX takes a collection of WAV files and concatenates them.  It optionally inserts an audio separator between the files.  The output is a single WAV (audio) file made from the contents of the WAV files in the aforementioned collection.

The individual WAV files can exhibit varying attributes.  For example, there is the sampling rate, one channel or two channels, and sample size (8-bit, 16-bit).  You choose the sampling rate and the number of channels in the output file.  WAVConcatX takes care of the necessary conversions.






Downdater for Windows PC


The longest common subsequence (LCS) problem is the problem of finding the longest subsequence common to all sequences in a set of sequences (often just two sequences). It differs from problems of finding common substrings: unlike substrings, subsequences are not required to occupy consecutive positions within the original sequences. The longest common subsequence problem is a classic computer science problem, the basis of data comparison programs such as the diff utility, and has applications in bioinformatics. It is also widely used by revision control systems such as Git for reconciling multiple changes made to a revision-controlled collection of files.


A “downdater” is a text file comparison program.  It produces from similar inputs (2 files) a differences file (1 file) that can be applied to the “A” file to produce the “B” file.  Differences are denoted





The lines that follow –N are inserted after line N in file “A”.  The lines that follow –N,M are inserted in place of lines N through M in file “A”.


You can compare two files with DOWN by using the following syntax:


   DOWN <name-of-file-A> <name-of-file-B> <differences-file>


You can compare files in corresponding directories with the following syntax:


   DOWN <name-of-directory-A> <name-of-directory-B> <differences-file>


When comparing directories, the various difference files are separated with a record of the form:




Note that only certain source code and symbolic files are eligible for comparison.   A complete list is available if you send a stamped, self-addressed envelope to the author.


A better way to compare an old folder containing symbolic files with an updated version of the same folder involves a special call to DOWN, followed by execution of a skeleton, followed by execution of a BAT script that calls DOWN repeatedly to create several differences files rather than the single such file that otherwise is produced.  The syntax of the special call is


   DOWN *<name-of-older-folder> <name-of-newer-folder> <name-of-new-differences-folder>


Notice the asterisk that comes before <name-of-older-folder.  This signifies that DOWN is to produce an SSG skeleton in the new-differences-file together with an SGS file to be used with the skeleton.  The skeleton, in conjunction with the stream generation statements, produces a CMD script that builds a DifferencesFolder inside the new-differences folder.  Only those folder pairs that exist and exhibit differences end up in the DifferencesFolder. 


Example:  Run DOWN *first-directory second-directory directory-to-place-skeleton.  Then CD to directory-to-place-skeleton and type RUN.BAT.  This launches a lengthy DOS script that repeatedly calls DOWN to construct a DifferencesFolder, which see.  As part of this mechanism, the tree structures of the first-named directories are compared and differences reported, if any.  This operation requires that you have installed the Symbolic Stream Generator (SSG).


A fourth argument on the command line is optional and may be –N or –R.  You can suppress the Directory Structure Examiner with the –N option.  You can reverse the order of the first two arguments with the –R option.



SIRASM2 takes the output of DOWN and applies it to what is called a base text file to produce an updated text file.  For example, suppose the base file is





And the updated file is





Then DOWN will produce the following differences file




The command

SIRASM2 base diff updated

reproduces the updated file given only the base file and the differences file.



Here is a sample of real-world output.  The asterisk record signifies the following difference records apply to the named file.





IBMCHECK implements the Luhn Algorithm.  It allows you to enter a credit card number and be informed whether it is valid.  You can enter the number as it appears on your credit card, with spaces every four digits, press a button, and the spaces disappear.  The number is copied to the Windows Clipboard for pasting into a text box on some retailer’s website.  Retailer websites typically get upset when you leave the spaces in place.



SSG (Symbolic Stream Generator) is an app that compiles a program called a “skeleton” and simultaneously compiles a text file that is filled with Stream Generation Statements (SGSes).  The skeleton contains the logic.  The SGSes contain the data.  The program creates a text file in accordance with directives in the SGSes.  SSG is a handy tool when you want to generate, for example, a lengthy program structure (e.g. a case statement for incorporation within a C++ or C# app) based on a list of things.  I have used it many times for that purpose.  But SSG is capable of doing more complex things.  For example, a commercial software publisher uses it to generate MXML, the language of Adobe Flex, to produce web apps that allow end users to enjoy a Rich Internet Experience.  The SGSes describe what the page or pages are supposed to look like and the skeleton transforms the description into exactly the right MXML for the purpose.  You can RTFM at



CORR is the Directory Date Corrector.  Ideally, Windows would ensure the timestamp applied to every directory would reflect the contents of each directory.  The file inside a directory with the latest last-date/time-of-modification would be honored to have its timestamp applied to its enclosing directory or directories.  So that is what CORR does.  Which directories (now called Folders by marketing) get what timestamps is decided by tournament rules.  CORR makes it possible to inspect the folder contents of a folder and decide which folders need further inspection because of recent updates to the files inside.



KeepClockUpdated is a service app that ensures the system clock stays accurate, with checks done for accuracy every 5 minutes.  This entails a time source query every 5 minutes.  In one commercial application, KeepClockUpdated is responsible for setting the clock on 24 different computers by comparing each computer's clock with a local time source; one that obtains its very accurate reading from GPS satellites.   (The native Windows time setting mechanism only checks the computer maybe once per day.  Its time source is a computer on the Internet.)  All the magic depends on an understanding of the Network Time Protocol (NTP) that communicates via UDP on port 123.  You can set the calendar and time-of-day to an inaccurate value and wait until some multiple of five minutes past the hour arrives on the clock.  From the time source, KeepClockUpdated obtains the date and time and compares them with the computer's own notion of date and time.  When the two are at variance, KeepClockUpdated changes the computer's clock and calendar to match.  KeepClockUpdated is not appropriate to every setting.  For example, you would not properly employ it where the time source is not in the same building complex as the computers that are running the app.



WINSVCFILCPY is service app that runs 24/7.  Once a day, at 0300, it copies key files from their usual staging area to a backup staging area. This is done in order to mitigate the risk that the usual staging area, a Microsoft software-based mirrored pair of HDDs, may become useless as a Microsoft software-based RAID-5 cluster did in September 2013.



FileLogger monitors file changes.  It displays them as they occur in real-time.  It keeps a running log of changes and can copy the log to a file if you choose to do so.






Password Generator generates random passwords.  They are, by default, a mixture of numerals, upper- and lower-case letters.  You specify the length you want up to 40 characters.  You can choose to have only upper-case or only lower-case letters.  A non-alphanumeric character can be randomly inserted if you choose to do so.  The generated password is put on the Windows Clipboard for ease of placement in a textbox on a web page.  These passwords are hard for hackers to guess and that makes them extraordinarily secure.




File Mover Service (FMS)

FMS is responsible for copying TRV files in folders P1 through P9 from the production computer to the backup computer.  This is in progress all the time, with throttling imposed to limit impact on an Interactive Voice Response application, except during the graveyard shift.  However, see note, below, regarding limitations imposed by an Interactive Voice Response application.  A given file is copied under the condition that the source file is newer than the destination file or when there is no destination file.  For example, suppose \\DIALIN1\P1\1547.TRV is to be copied to \\DIALIN2\P1\1547.TRV .  It follows that copying will occur only when \\DIALIN2\P1\1547.TRV does not already exist and when \\DIALIN2\P1\1547.TRV  time-of-last-write indicates that it is older than \\DIALIN1\P1\1547.TRV .

You can change the direction of copying with the application NamedPipesClient.  Simply connect, then type from-1-to-2 or from-2-to-1 in the Send Message area of the dialog box and press the Send button.  When you switch the phone lines from DIALIN1 to DIALIN2 (or the reverse), you should remember to change the direction of copying.  NamedPipesClient must be run with elevated privileges.








Individual Computer Housekeeping Service (ICHS)


ICHS is responsible for performing three functions:

1.  Midnight Movers

2.  Sunday Movers

3.  Richmond Download

Midnight Movers happens at 29 minutes past midnight every night.  It prepares for the upcoming business day by clearing today’s stories out of their today’s slots and moving them to yesterday’s slots.

Sunday Movers happens at 28 minutes past one o’clock on Sunday morning.  It prepares for the upcoming business week by clearing files from their daily slots and putting them into a weekly backup location.

Richmond Download implements the File Transfer Protocol so as to acquire copies of files 1501.TRV through 1505.TRV, which are voice files from the Richmond Times-Dispatch.  This download occurs daily at five minutes past noon.







Original P1                Daily Copy To New P5

1000.TRV-1099.TRV                               1000.TRV-1099.TRV

1100.TRV-1199.TRV                               1100.TRV-1199.TRV

1300.TRV-1399.TRV                               1300.TRV-1399.TRV

1500.TRV-1599.TRV                               1500.TRV-1599.TRV

1700.TRV-1799.TRV                               1700.TRV-1799.TRV

1800.TRV-1899.TRV                               1800.TRV-1899.TRV

2000.TRV-2099.TRV                               2000.TRV-2099.TRV

2100.TRV-2110.TRV                               2100.TRV-2110.TRV

3600.TRV-3620.TRV                               3600.TRV-3620.TRV

3700.TRV-3720.TRV                               3700.TRV-3720.TRV

3900.TRV-3999.TRV                               3900.TRV-3999.TRV

4000.TRV-4099.TRV                               4000.TRV-4099.TRV

4100.TRV-4199.TRV                               4100.TRV-4199.TRV

4500.TRV-4599.TRV                               4500.TRV-4599.TRV

4700.TRV-4799.TRV                               4700.TRV-4799.TRV   





Original P6                Daily Copy To New P6

1000.TRV-1099.TRV                               8400.TRV-8499.TRV

1100.TRV-1199.TRV                               8500.TRV-8599.TRV

3900.TRV-3999.TRV                               8600.TRV-8699.TRV

4000.TRV-4099.TRV                               8700.TRV-8799.TRV

4100.TRV-4199.TRV                               8800.TRV-8899.TRV

1300.TRV-1399.TRV                               8900.TRV-8999.TRV

1600.TRV-1699.TRV                               9000.TRV-9099.TRV

1900.TRV-1999.TRV                               9100.TRV-9199.TRV

1800.TRV-1899.TRV                               9200.TRV-9299.TRV

4500.TRV-4520.TRV                               9300.TRV-9320.TRV

4600.TRV-4620.TRV                               9400.TRV-9420.TRV

4700.TRV-4720.TRV                               9500.TRV-9520.TRV

5100.TRV-5120.TRV                               9600.TRV-9620.TRV

5200.TRV-5220.TRV                               9700.TRV-9720.TRV

5300.TRV-5320.TRV                               9800.TRV-9820.TRV




Per the script that formerly was launched on Sundays:


del from P1 4801-4899",

del from P1 9601-9699",

del from P1 9701-9799",

copy p1 2901-2999 to p1 4801-4899",sb

copy p1 2501-2599 to p1 9601-9699",sb

copy p1 2401-2499 to p1 9701-9799",sb

move p1 2901-2999 to p1 4801-4899",

move p1 2501-2599 to p1 9601-9699",

move p1 2401-2499 to p1 9701-9799",


The indicated files are deleted from the P1 directory, copied from the P1 directory, or relocated away from the P1 directory, in the indicated order.  The sb notation indicates that copying is directed to the SundayBackup directory.


Simple Backup/Restore makes backup files from collections of directories.  You choose which directories to backup.  The backup file sports the filename extension .SB.  The content of each backed up file is internally associated with its name and its time of last modification.  Simple Backup/Restore was developed in response an incident where a commercial file backup app failed when the computer, which it was backing up, failed catastrophically.   The partially readable backup file had to be recovered through the purchase of additional commercially available software that was capable of sifting through a complex, partially corrupted database.  The central concept of System Backup is simplicity.  A partially completed backup file remains readable.  All the work completed up to the point of failure, if any, is fully recoverable without resort to extraordinary means.






The Metropolitan Washington Ear, a radio reading service for the blind, offers audio streaming via the Internet.  They moved to their own, dedicated building and infrastructure in 2008.  Their website was not appropriately updated to cater to different audio streaming software.  This web page was developed by MARK DANA ROCKMAN to allow listeners to hear the audio stream:  something that was impossible before I created this page and hosted it on my corporate web site.





A Complete List of Rockman's Text Editor Commands


General Principles

The Rockman Text Editor accepts commands from the keyboard or from a file. The syntax of the shell command is

ed [name-of-file-to-be-edited [name-of-command-stream]]

You can omit both command line arguments, in which case commands can establish what is to be edited, and commands shall originate at the keyboard. You must provide name-of-file-to-be-edited when you want to provide name-of-command-stream.

Commands comprise three parts: 1) the name of the command, 2) option, 3) arguments. Example:

r,11 PAIJ

contains the r command, the option 11, and the argument PAIJ. Only the name of the command is mandatory.

The editor maintains the file that is being edited in area called the memory file.  The content of the memory file can be created from scratch or it may originate in a file in a file system on a device.  The primarily purpose of the Text Editor is to support your efforts to make changes to the memory file.   Eventually, once you are done making changes, the memory file is copied to a file in a file system on a device for long-term storage.

The editor is either in EDIT mode or in INPUT mode. You can switch between modes by entering a blank line. In EDIT mode, you can instruct the editor with commands. In INPUT mode, non-blank lines are successively added to the memory file.

The editor pulls all of the file's text into memory. In memory is where all the editing occurs. At the end of your editing session, it is your choice whether to save any changes that you have made or to discard the changes. Type EXIT to save the changes. Type OMIT to discard them.

While you are editing, keep in mind that there is always a current line, which you can see by typing PRINT.  Navigation throughout the memory file is by line number, which may be absolute (e.g. go to line 5) or relative (e.g. go 5 lines down from here).

The text editor is one of several Rockman's Tools that you may find useful.  The Symbolic Stream Generator allows you to write programs that generate text files based on simple, structured data.  The Downdater allows you to see the differences between text files presented in -n and -n,m notation.  SIRASM2 allows you to apply changes in -n and -n,m notation to a text file in order to obtain a new text file.


Write to

Command Documentation


The add command brings in at the current location additional lines from either of two sources. If you name a text file then the full file is added at the current point in the file being edited. If you don't name a file then lines from the most recent COPY or DCOPY command are added at the same place.


The append command relocates the current edit point to after the last line in the file being edited. The editor then goes into INSERT mode.


The begin command works with the COPY and DCOPY commands to mark the starting line of a copy operation.


The bt command displays the operating system version, the computer name, the time of last system reboot (also called system restart), and the duration of current system uptime.  Additional information about the computing environment is provided in the edit file.  For example, OSArchitecture 64-bit is an environmental factoid that may interest you.


The cd command changes the current working directory to the named directory.


The change command replaces one occurrence of a string with something else. The argument contains the pattern /old-string/new-string/ where the slash is some convenient delimiting character, old-string is a substring to be replaced, and new-string is what the replacement shall be.


The changeall command is identical to the change command except that all occurrences of old-string on the current line are changed.


The changewholefile command is identical to the changeall command except that the entire file being edited is targeted for change.


The climit command limits the range of columns affected by any of the forms of the change command. Specify the left and right column numbers separated by a comma. Example: cli 4,6


The close command causes the editor to write the lines in the memory file to disk and then causes the editor to terminate.


The commands command lists the cannonical names of all the editor's commands in sorted order.


The copy command creates a store that contains the lines between the begin marker and the current line.


The cpumask command reports the configuration of central processors in the local computer. 



The deleteafter command finds a match on the current line, erases the match, and everything to the right of the match.


The dcopy command is identical to the copy command except that the lines that are sent to the store are deleted.


The delete command removes one or more lines from the file being edited starting with the current line. You can specify the number of lines to delete (e.g. DELETE 5). The default number is 1.


The dhold command saves the current line to a special store (named the "hold" buffer) and deletes the line from the file being edited. You can resurrect the line with the dup command.


Suppose you have a folder.  In that folder are several other folders.  These are top level folders.  You want to know how much space the files in those folders occupy.  The dirsize command reports that information.


The dnext command deletes the current line and sets the current line to the line that follows it.


The dse command performs a Directory Structure Examination.  You can detect structural differences between similar directories. A structural difference occurs when a directory or a file appears in one root directory but not in the corresponding place in the other.



The dup command inserts one or more lines at the current position. The lines inserted originate in the hold buffer. You can specify the number of lines to duplicate (e.g. DUPLICATE 5). The default number is 1.


The eject command causes the operating system to flush the buffers of a removable device and, perhaps, to physically eject the device. The format is ej drive-letter.


The elname command displays the name of the file that is being edited.


The erl command does a patterned extract of records from a comma-separated values file.  The idea is to get rid of the column heading records and various interstitial records that clutter up the file.  You specify, in order, the name of the input file, the name of the output file, the number of records to discard at the start of the file, and the number of records to skip following those records that are retained. The command assumes that retained records boast of a date in MM-DD-YY format in the leftmost column.  Since Excel handles that format inconsistently, the command reformats the date to Month Day, Year format.  For example, 01-02-03 is transformed to “January 2, 2003”.  If you have a text file open when you type in the erl command then the extracted lines end up in the file.  If not, not.  The command to extract retained lines could be:  erl C:\Users\Public\TESTBED.TXT "C:\Users\Public\Outlet.txt" "2" 1


The exit command causes the editor to write the lines in the memory file to disk and then causes the editor to terminate.


The f1 command changes routes.rb in a Ruby on Rails application file so that the application uses named routes.


The filecompare commands performs a byte-for-byte comparison of the two files that you name.  The answer is YES or NO.  YES: the two files are identical.  NO: the two files are different.  Suppose some program you’ve been using for years suddenly halts with an addressing exception.  Suppose you have a backup copy of the .EXE file.  Suppose you compare the backup with the production copy.  Then you can assure yourself that the problem is not due to file corruption.


The find command searches the lines following the current line for a matching pattern. In the pattern, space characters match any character at the same relative position on a targeted line. You can use find to locate based on columnar position. When a tab character is defined (see tab command), you can use them as part of the pattern. For example, suppose LMJ appears in columns 11, 12, and 13 respectively. With the tab character set to semi-colon and tab positions set to 11, 21, and 39, the command

find ;LMJ

matches on the first line following the current line that contains LMJ in columns 11, 12, and 13.  The command option specifies the desired number of match occurrences.  The default is 1.


The flist command creates in the current file a complete listing (with headings) of the symbolic files of the named directory.


The getfiles command calls System.IO.Directory.GetFiles() to obtain a list of the files in the named directory.  This list does not include the names of any directories in the named directory.  Interestingly, some files that are, in fact, in the named directory, are omitted.  You can see these files with the shell dir command.


The goto command relocates the current position to the line whose number is given. A synonym for goto is simply the line number.


The head command is identical in function to goto 1.


The hold command saves the content of the current line to a special place inside the editor called the "hold" buffer.  You can resurrect the line with the DUP command.


The hw command sets a horizontal window on the file being edited. The window applies to a specified range of columns. For display purposes only, columns outside the window do not appear. Suppose you want to see columns 11 through 21. You enter hw 11 21.


The ibefore command is identical to the insert command except that the line is inserted before the current line.


The insert command inserts a new line after the current line.


The kill command terminates the process whose name you specify.


The last command relocates the current position to the last line in the file.


The lgoff command causes the editor to exit without saving the current file and causes the Windows logon session to terminate.


The locate command is similar to the find command except that there is no columnar bias in the pattern. Searching begins with the first line after the current line and is not case sensitive.


The ls command lists the directories and file in the current working directory.


The mdl command maps a drive letter to a share (i.e. a shared directory (also known as a shared folder)).  The argument is of the form <drive-letter> <share>.  Example:  mdl B \\fserv\wpdocsb


The next command relocates the current position to the next line in the file.


The o command is similar to the print command except that printing starts with the line following the current line.


The omit command causes the editor to exit without saving the memory file to disk.


The open command begin a new editing session by loading the named file's lines into memory. The named file must pre-exist.


The opennew command is similar to the open command except that the file need not pre-exist and, if it does, the content of the file is truncated.


The own command reports the owner of the specified directory or file.


The print command prints the current line and the next n minus one lines that follow it, where n is the number stated in the command.  Example:


means print the current line and the 4 lines that follow it.


The ps command reports the names of existing processes.  Any of these could be terminated using the kill command.


The putquotesaround command revises the lines of the current file so that each line is quoted (surrounded by double-quotes) and preceded by the characters TAG followed by a space.  Should a line contain a double-quote character, putting quotes around a quote character would be ambiguous.   You can provide a substitute for such characters as in PQA `.  In this example, the ` character replaces all occurrences of ".  The default substitution is \".


The pwoff command causes the editor to exit without saving the current file and causes Windows to power off the computer.


The rb command causes the editor to exit without saving the current file and causes Windows to reboot (also known as "restart") the computer.


The retype command is similar to the insert command except that the line affected is the current line.  The option of the retype command, when present, specifies the column at which the first character of the argument is to be placed.  For example,

r,11 LMJ

leaves alone the content of columns 1 through 10 and puts the argument into the line starting at column 11.


The reverse command reverses the order of the lines in the file. For example, the file 1 2 3 becomes 3 2 1.  Apply the command twice and 3 2 1 becomes 1 2 3.


The ro command takes a directory argument and marks as read-only all the files the directory (and its directories and their directories). The opposite operation is handled by the uro command.


The scale command prints a column scale extending from column 1 through column 80.


The sort command reorders the lines in the memory file so that they appear alphabetically.


The tab command allows you to establish a tab character and several column stops. This is handy when entering columnar data. For example, if you enter the command

tab ; 11 21 39

then enter the command

i ;LMJ;X11,EDIT$;. Open the EDIT$ packet

you will create a new line with the various segments left-aligned at the indicated column stops.


The td command displays the date and time last written of the file being edited.


The toc command erases the current file in memory and creates a new file in memory that enumerates the directories and files in the named directory.


The top command sets the current line to zero.


The touch command updates the time-of-last-write of the argument file to match the current time. Should the file not exist, it is created with zero content.


The up command sets the current line to the line immediately above (numbered one less than) the current line.


The uro command removes the read-only attribute from all the files in the argument directory (and the directories it contains and the directories they contain).


The vw command sets a vertical window in which appears a subset of lines of the file being edited. If an n-line subset of the file is in the vertical window then the lines are numbered 1 to n and changes that you may apply affect only the lines in the window. You set the vertical window by stating the starting and ending line numbers as in vw 2 4 which saves the entire file to a hidden location and commences editing of the subset. You merge the subset back into the main file by entering vw without arguments.


The winplaces command displays the folderpaths of all the system special folders. When a text file is open it is replaced with a report similar to this:



The wpt command waits for a process to terminate.  Just give the name of the process and wpt loops until the named process disappears from the system.


The write command transfers the lines in memory to the named disk file and terminates the editor.


Nutrients to Foods (NTF)


Anybody can look up the nutrients contained within foodstuffs.  But what if you know what nutrients you want?  What foods should you eat to get those nutrients?  The answer is provided by NTF.





There are two version of SHUTDOWN.  Both of them work.  The second one fully exercises the Windows API for logging off and for rebooting and powering off the computer.






This app is much handier than pointing and clicking around Windows’ own user interface for doing what SHUTDOWN does.  In some contexts there is no obvious way to cause Windows to reboot.





Sometimes you just want to see exactly what a file contains.





A computer that runs 24/7 is responsible for an IVR application.  The application maintains a large set of files inside a directory structure.  There are two kinds of file:  audio and database.  Both kinds are possessed by the IVR application in that they are to be instantaneously available to the IVR application.  Interference from applications outside the IVR application is dealt with severely:  the IVR application reboots the computer.  It deals with every anomaly this way.  There is no log entry documenting the fact that the IVR application has decided to reboot the computer.  We just watch, in horror, as the machine restarts.  It would be convenient for the manager in charge of the IVR application to become cognizant of the situation immediately upon its occurrence.  Enter MWE-DIAL-IN-CRASH-MONITOR, which pings the computer and plays a tune in the event of no response.

Numerous reboots over the years have been described as being due to interference from applications that are outside the purview of the IVR application.  Somebody “locked” the file.  That is to say, some application has opened the file so it can be backed up for good and proper administrative reasons.   Other potential problems revolve around file metadata such as who owns the file, whether the file is compressed, whether the file is read-only, whether the file has other strange attributes like SYSTEM and HIDDEN.  Folklore tells us the IVR application is quite strict as to what attributes a file may be blessed with.  These, we learn, are N (the attribute a file gets when it has no other attributes) and A (the attribute a file gets when it is ripe for being backed up).  All others are forbidden.  When the IVR application finds a tainted file, it reboots the computer.

Folklore isn’t necessarily an accurate reflection of reality.  In actual fact, the IVR application probably reboots the computer only in the event of a file access conflict and for reasons that have nothing whatever to do with the file system, its behavior and contents.




TRT32 FILE REPAIR aims to change file metadata to conform to the IVR application’s strict attributes rules.


How to Kill a Process

Your application craves to terminate another process.  Here is how to do it.

namespace EditTechnology


    public class kill


        public static bool WasteHim(String whomToWaste)   // true indicates the process was found and kill was called on it


            string whomWeGonnaWaste = whomToWaste;

            System.Diagnostics.Process[] localAll = System.Diagnostics.Process.GetProcesses();

            foreach (System.Diagnostics.Process p in localAll)


                if (p.ProcessName.Equals(whomWeGonnaWaste))



                    return true;



            return false;  // process by the specified name was NOT found





Notice that what is going on here is enumeration of all the processes in the system.  One of those may have a name that matches the argument.  It is the one, if such exists, that gets the axe.


How to Launch a Process

class Launch


        public bool Process(string nameOfFile)



            System.Diagnostics.Process myProcess = new System.Diagnostics.Process();




                // Get the path that stores user documents.

                string myProgramFilesPath =



                myProcess.StartInfo.FileName = myProgramFilesPath + "\\NOTEPAD.EXE";

                myProcess.StartInfo.Arguments = nameOfFile;

                myProcess.StartInfo.Verb = "Open";

                myProcess.StartInfo.CreateNoWindow = true;





                return false;


            return true;



How to Launch a Process and Gather Its STDOUT


This shows how to launch a console program (a program that can be found among the directories that are listed in the PATH environment variable of the logged-in user’s profile) and have its output sent to a string variable.  The lines of output are separated by carriage returns and/or line feeds.



Interoperability:  Hooking Managed Code to Unmanaged Code

Managed code is produced by Visual Studio for consumption at runtime by a Just-In-Time (JIT) compiler.  The JIT Compiler transforms Intermediate Language (IL) to machine code and performs runtime checks for type safeness and validity to ensure proper operation and security.  IL is code written for a machine that hasn’t been realized in hardware but is code that can readily be transformed to machine code.  Code that is written in languages such as C# and Visual Basic becomes IL before it becomes machine code.

Interoperability (INTEROP) is the mechanism that enables the methods in managed code to call the methods in unmanaged code. 

Unmanaged code is produced by Visual Studio for languages like C++.  This is direct-to-machine-code compiling.  The only validity checks are the ones that are performed during compilation.  C++ programs are ready to load and execute.  There is no JIT compiling.  There is a variation of C++ that can be compiled to IL and which uses the Common Language Runtime of the .Net Framework, the same as C#.  Why use unmanaged code?  It is because a C++ program is the place where you have access to the entirety of the Win32 API.  Many operating system features are virtually inaccessible from managed code. There is no support in CLR, for example, that lets a programmer instruct the operating system to reboot itself.  Named pipes?  There is nothing in CLR for those.  But Win32 and INTEROP provide the solution.  In the case of named pipes, there is no need for a DLL.  INTEROP takes care of the whole problem.

Consider the case where a Win32 method must be invoked in order to complete the requirements of a C# application program.  The Windows API, informally WinAPI, is Microsoft's core set of application programming interfaces (APIs) available in the Microsoft Windows operating systems. The name Windows API collectively refers to a number of different platform implementations that are often referred to by their own names (for example, Win32 API).

INTEROP entails marshaling of arguments and of a return value.  A programmer writes the Win32 method in C++, compiles it into a Dynamic Link Library with a specific release of Visual Studio, and chooses whether the DLL is targeted for a 32-bit or a 64-bit environment.  Another programmer writes C# code that calls the Win32 method.  In C# the programmer must declare the external method and decorate the declaration which names the containing DLL and its location in the file system.  When deploying the solution, the end user must be provided with the C# executable (the .EXE file), the C++ dynamic link library (the .DLL file), and instructions on which Visual C++ Redistributable Library must be installed to make a home convivial to INTEROP and Win32 executable code. 

The made-up term bitness refers to machine and operating system architecture: 32-bit or 64-bit.  The Intel 80386 and follow-on products are 32-bit platforms.  Advanced Micro Devices invented what became the industry standard 64-bit architecture, well after Intel’s introduction of its proprietary 64-bit Intel Itanium Architecture.  See Intel now also manufactures in accord with the Advanced Micro Devices’ design.  When 64-bit is referenced, the architecture that springs to mind is the AMD one, not the Intel one; although they persist and co-exist.  Windows operating system SKUs come in 32-bit and 64-bit flavors.  Either of these can be installed on 64-bit hardware platforms.  On 32-bit hardware platforms only 32-bit Windows can be installed.  Visual C++ Redistributable Library comes in 32-bit and 64-bit flavors.  (The 64-bit flavor can be used only on computers that are running a 64-bit version of Windows.)  There are several versions of Visual C++ Redistributable Library that are individually associated with specific Visual Studio releases.  The Visual Studio release is the one that is used to compile the unmanaged code.  Some combination of Visual Studio release, Visual C++ Redistributable Library, 32-bit/64-bit compilation choice, hardware platform bitness, and operating system bitness can be found that will support successful INTEROP calls.

Here is how C# is used to declare an external C++ method for calling via INTEROP.


Notice this declaration not only declares the name, arguments, and return type of the method, but it also declares the file system location of the containing Dynamic Link Library.

Here is how C# calls the unmanaged method.  The declaration makes this syntactically and semantically legal.


Finally, here is the unmanaged C++ code that could, if it wanted to, call any of the various Win32 methods.


Here is a real-world C++ method that allows a C# application to reboot the computer.




1.    The bitness of the hardware.

2.    The bitness of the operating system.

3.    The bitness of the compiled DLL.

4.    The version of Visual Studio that is used to compile the DLL.

5.    The version of the Visual C++ runtime redistributable library.



How to Create a Dynamic Link Library in Visual Studio 2010


To create a new dynamic link library (DLL) project



1. On the menu bar, choose File, New, Project.



2. In the left pane of the New Project dialog box, expand Installed Templates, Visual C++, and then select Win32.



3. In the center pane, select Win32 Console Application.



4. Specify a name for the project—for example, MathFuncsDll—in the Name box. Specify a name for the solution—for example, DynamicLibrary—in the Solution Name box. Choose the OK button.



5. On the Overview page of the Win32 Application Wizard dialog box, choose the Next button.



6. On the Application Settings page, under Application type, select DLL.



7. Choose the Finish button to create the project.



The Care and Feeding of Named Pipes in Services

In computing, a named pipe (also known as a FIFO for its behavior) is an extension to the traditional pipe concept on Unix and Unix-like systems, and is one of the methods of inter-process communication (IPC). The concept is also found in OS/2 and Microsoft Windows, although the semantics differ substantially. A traditional pipe is "unnamed" because it exists anonymously and persists only for as long as the process is running. A named pipe is system-persistent and exists beyond the life of the process and can be deleted once it is no longer being used. Processes generally attach to the named pipes (usually appearing as a file) to perform inter-process communication.

A named pipe is a message conduit.  It bi-directionally conducts messages between processes.  Program A and Program B can connect to a named pipe and send messages to each other without involving rotating magnetic memory devices.  All the magic happens in software and in main memory.

Named pipes are especially handy when it becomes necessary to communicate with daemons, also-known-as Windows NT Services.  The term daemon is popular in Unix and is almost unknown in Windows, but the concept is the same.  A daemon is a program that generally starts automatically after a reboot and runs constantly.  It runs independently of a shell or graphical user interface, which makes it hard to communicate with them.  Enter named pipes.  With named pipes, an application that possesses a user interface is able to send and receive messages to and from a daemon.

The daemon implements a named pipes Server that is constantly watchful for Clients that wish to connect to the Server.  Independent Client sessions are thereby established and lines of communication opened.



 * The Server


 * The purpose of The Server is to maintain and service a collection of clients who connect via a mechanism known as Named Pipes.

 * There is no .NET API for Named Pipes.  So The Server uses System.Runtime.InteropServices to call the necessary Win32 APIs.

 * Fortunately, the APIs are not too complicated nor demanding.  The Named Pipes methods are CreateNamedPipe and ConnectNamedPipe.

 * These are defined by the Windows Dynamic Link Library file kernel32.dll.  The trick is in parameterizing the calls correctly.

 * Named Pipes is the perfect mechanism for communicating with a Windows Service.  A Windows Service is a process that Windows

 * starts at boot time.  There is no conventional user interface.  For example, a Windows Service has no shell and no GUI.


 * The Server maintains a non-generic List (a collection) of Client objects.  The Client object is a non-behaving structure that

 * represents an individual connected client by Named Pipes handle and Filestream, if any.


 * The Server sends messages to users via an event mechanism.  Users register a method that is called when

 * The Server sends a message that it has received from a client. 


 * Users of The Server are able to send messages.  When this happens, each of the connected clients is destined to receive the message.

 * Said users send messages to The Server via the SendMessage() method of The Server.


 * The Start() method of The Server gets things going by forking a thread to field messages that clients send to The Server.

 * The aforementioned thread is called The Listener because it "listens" for clients to "speak."  The Listener is a

 * perpetual loop that exits only when a Named Pipes error occurs or because somebody calls the Stop() method of The Server.

 * On each pass of the loop The Server calls CreateNamedPipe to obtain what is called a Client Handle.  This call blocks

 * until a client connects or until Named Pipes (the complex of software) decides that blocking forever would be futile.

 * For example, the process may be exiting.  In that case, CreateNamedPipe returns an invalid handle, which is detected and

 * handled by The Server by terminating The Listener thread.  Normally, CreateNamedPipe returns a valid handle and this

 * represents a connecting client that usually may be found running in a separate process.  The method ConnectNamedPipe is

 * called to complete the connection between client and server.  Should this error, The Server terminates The Listener.

 * In the usual case of "no error," The Server creates a new Client object and puts the handle in it.  Then The Server

 * locks the client list and adds the Client object to it in one atomic action.  Finally, The Server forks a thread to handle

 * the arrival of messages from the client.  The Reader (as represented by the Read() method of The Server) is passed a

 * reference to the aforementioned Client object.


 * The Read() method of The Server creates a FileStream object based on the handle in the Client object that The Listener passes.

 * Then The Reader enters a perpetual loop that terminates upon the occurrence of an error condition or the Stop() method is called.

 * A reference to the FileStream is put in the Client object next to the handle and the FileStream Read() method is called.

 * This call blocks until a message arrives or an error condition arises.  A zero length message is an error condition that may

 * occur after the client disconnects.   In the normal case, bytes arrive and must be dispatched via an event to the user of

 * The Server.   The bytes are first converted to a string.  In the error case, the handle is closed, the stream is closed,

 * and the client object is removed under lock from the client list.  The Reader thread is then terminated.


 * The user of The Server is responsible to provide the name for a Named Pipe that matches the name that clients will use.

 * For example, if X is a reference to The Server object then X.PipeName can appear to the left of the assignment operator to

 * receive a string of the form \\.\pipe\<name-of-pipe>.  The user then must register a method to handle message arrival events.

 * As before, X is a reference to The Server object.  So X.MessageReceived can appear to the left of the delegate add operator.

 * The assignment is of a delegate instance that points to a method that shall be invoked by The Server when a message arrives.

 * The method receives two arguments in the following order:  1) a reference to the client object, and 2) the message as a string.


 * The user of The Server is in full control of the life of The Server.  Life begins with initialization and Start() and ends

 * with Stop().




Solving Mysterious System Crashes


Suppose your computer performs some vital function and it reboots during peak usage periods for unknown reasons.  You’d like to know why, wouldn’t you?  Enter the system dump and dump analyzer.  To enable Windows to take a dump you must configure Windows to do so.  Ideally you will collect as much data possible in order to allow the dump analyzer the greatest opportunity to spell it out for you.  Microsoft provides some guidance on how to size the page file since that file receives the memory dump during the crash.  See


According to that document you should configure the page file by following to the formula A+B, where A is the amount of main memory in the computer’s hardware and B is 257,000,000 bytes.  B is space required to accommodate symbol tables and headers for the various portions of the dump.  Ideally your computer will take a full system dump when a crash occurs.  The other options are “no dump at all,” and “a minidump.” 


If your system is crashing and you cannot find a dump file (filename extension .dmp) then likely your page file is too small.  On a Windows XP machine with 2GB of main memory 4GB (the maximum allowed) of page file should be plenty.


Usually that which causes system crashes is third-party device drivers that contain faults and issues.  Imagine a linked list that contains an invalid address in one of its pointers.


Microsoft provides WinDbg, a dump analyzer.  There is a commercial product known as WhoCrashed that also provides dump analysis, perhaps in a manner accessible to mere mortals.  Visit their website at


Latest version: 5.03

WhoCrashed reveals the drivers responsible for crashing your computer



Whenever a computer running Windows suddenly reboots without displaying any notice or blue screen of death, the first thing that is often thought about is a hardware failure. In reality, most crashes are caused by malfunctioning device drivers and kernel modules. In case of a kernel error, most computers running Windows do not show a blue screen unless they are configured to do so. Instead these systems suddenly reboot without any notice.


WhoCrashed shows the drivers that have been crashing your computer with a single click. In most cases it can pinpoint the offending drivers that have been causing misery on your computer system in the past. It does post-mortem crashdump analysis and presents all gathered information in a comprehensible way.


Normally, debugging skills and a set of debugging tools are required to do post-mortem crash dump analysis. By using this utility you do not need any debugging skills to be able to find out what drivers are causing trouble to your computer.


MARK DANA ROCKMAN offers no endorsement of this product and is in no way liable for problems you may have using it, if any.





WinDbg is good for many things.  Among those things is using it as a dump analyzer for when you are able to cajole Windows into producing a dump file such as MEMORY.DMP.  You get a switch to throw that picks the kind of dump to be produced.  You get a number to specify that establishes the size of the Windows Page File.  To produce a full memory dump after an unfortunate computing event (i.e. a crash), the page file will have to be larger than the number of bytes that physical memory will hold.  Naturally, a memory dump has metadata alongside a clump of bytes.  If you have 2GB of physical main memory then 4GB of page file should be more than adequate.  You can leave page size management up to Windows to perform, but the question remains whether Windows is up to the task, especially when the object of the game to is to guarantee that a panic dump is available in the event of a crash.


In order for dump analysis to work correctly, WinDbg requires the symbol table that is created by Microsoft when it does the RTM build of Windows.  You require a specific symbol table for the specific Windows build that produced the dump.


Naturally, this issue progresses to questions such as 1) Where do I get WinDbg and 2) Where do I get the symbol table?  Also, if I get the symbol table, where does the symbol table get put by the symbol table installer?  The installer makes a Federal case out of copying a file, a set of files, and/or database and neglects to mention where it is located.  _NT_SYMBOL_PATH is an environment variable (you may want to create it) that translates to a string that names the location of the symbol table if you knew where that might be.


It can be reliably reported that WinDbg comes with the Windows Driver Kit, which you can download at no cost to you.  And symbols are readily available at


Download Windows Symbol Packages




According to PROCMON, a delightful tattletale, the place where the symbols installer puts all those PDB files is C:\Symbols.  So you should go to Advanced Settings and equate _NT_SYMBOL_PATH to C:\Symbols.


You might also try setting _NT_SYMBOL_PATH to the following




This last one takes the prize cake.  It turns out that symbol tables for the exact build you are running are almost impossible to find.  To fix that little conundrum there exists a way for your favorite debugger (I love WinDbg) to satiate its craving for symbol tables by drinking from the online fountain in The Cloud.  That “DownStreamStore,” above?  That’s The Cloud.  So my recommendation is that you set _NT_SYMBOL_PATH to the aforementioned value.  You get far less complaint from WinDbg about undefined symbols.






Do Not Block the Message Pump






The message pump drives the “app.”  Without messages flowing, the program stops behaving.  That is to say, there is no behavior.  You, the end user, see a Not Responding message.  That means the “app” is not processing what may well be a lengthy queue of messages.  That’s because the “app” is busy doing things other than processing messages.  Solution?  While you think the purpose of your program is to solve a business problem, Windows knows better.  The real purpose of your program is to process messages.  So you must create a thread to handle the business problem.  The initial thread thus is dedicated to handling messages.