The Birth of Windows Desktop

Steps involved in getting to your windows desktop from you power on the machine

Introduction

Have you ever thought of how your operating system(windows) is loaded? It’s quite interesting to know about the miniature details that are involved in the process. This article will shed some light on this topic.


Process

The actual execution of the processor begins when you power on the system. Following are the major steps involved.

1.       BIOS performs some initial check and read the Zero sector of the hard disc, This Zero sector has a special name - MBR(Master Boot Record)
2.       MBR contains two sections
   2.1.    Boot Code(446 bytes)
   2.2.    Partition Table Entries(16 bytes colored entries in the bottom)
3.       The purpose of boot code is to iterate over all the partition table entries and check for a bootable partition (if the first byte of the partition entry is 0x80 then it is a bootable partition. Also called as boot partition or system volume)(There can be only four entries specified in the MBR, does it mean we are limited with 4 drives ?)(this is where extended partitions come into picture)
4.       Now besides locating the boot partition it will know exactly from which sector the boot partition begins. This is done by examining the 8th-12th bytes in the partition entry(so in the above picture 3f 00 00 00converted to little endian we get 0000003f = 63rd Sector). In general it will be 63rd sector.
5.       Again the first sector(63rd) of the bootable partition is called as Boot Sector which contain enough code to read a special file named ntldr (NT loader) from the root (c:\) drive. This is the time where you may at times see “NTLDR is missing” error message. Following are the tasks performed by ntldr
   5.1.    The main purpose of ntldr is to setup the stage for the windows kernel to load.
   5.2.    It enables paging and preliminary hardware detection using BIOS routines(int) and ntdetect.com
   5.3.    Reads boot.ini  to display boot menu
   5.4.    If the system is hibernated during the last shutdown it will resumed from hiberfil.sys
   5.5.    Most importantly it loads boot start drivers ( these are the core drivers for proper functioning of OS) following are the examples for boot start drivers
   5.6.    Sets CPU registers e.t.c and pass on the control to ntoskrnl.exe(NT OS Kernel). This ends the life of ntldr
6.       Ntoskrnl is mainly responsible for setting up following OS services ( here you will see windows XP logo progress bar)
   6.1.    Phase 0 Initialization
      6.1.1. Memory Management Services
      6.1.2. Process Management Services(First kernel mode process the system process is created)
      6.1.3. Object Manger Services
      6.1.4. Plug and Play Management Services
      6.1.5. Security Reference Monitor Services
   6.2.    Phase 1 Initialization
      6.2.1. Hal initialization (Hardware Abstraction Layer)
      6.2.2. Multi processor support
      6.2.3. Scheduler support (inherently dependent on processor architecture)
      6.2.4. Power management
7.       Now the control is passed on to smss.exe(Session Manager Subsystem), It is the first user mode process that is created in the life span of windows.
   7.2.    The following are the tasks performed by smss process
      7.2.1.  Runs check disk ( disc check )
      7.2.2.  Pending file copy and file deletes ( some softwares need to overwrite the files which are in use by the OS and they will ask you for reboot) and this is the phase where those pending copy and deletes will be performed.  
      7.2.3. Page file is created(pagefile.sys)

   7.3.    Loads registry hives from \Windows\System32\Config\*.*
   7.4.    Finally it creates two processes csrss.exe(Client Server Run-Time Subsystem), Winlogon.exe
      7.4.1. Csrss.exe is responsible for user mode functionality of the system and sits as an interface for windows API)
      7.4.2. Winlogon.exe is responsible for starting all auto-start services (services.exe) and creating thelsass.exe(Local Security and Authentication Subsystem)  this process is for authenticating the user logins
      7.4.3. Next winlogon will show the logon screen to the user, upon successful logon winlogon will load the explorer.exe under the current user profile. This is where you will see the desktop

Though the actual process involves more complicated steps I have over simplified the overall flow in favor of novice users and tried not to lose the brevity of the content. Please feel free to comment on the post. +ve criticism is most welcome.

How To Get the Last ID Assigned by MySQL?

If you use an ID column with AUTO_INCREMENT attribute, you can use the mysql_insert_id() function to get the last ID value assigned by the MySQL server, as shown in the sample script below:

  include "mysql_connection.php";
  $sql = "INSERT INTO fyi_users (name)"
     . " VALUES ('John King')";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
    print("Last ID inserted: ".mysql_insert_id()."\n");
  } else {
    print("SQL statement failed.\n");
  }
  mysql_close($con);
?>
If you run this script, you will get something like this:
1 rows inserted.
Last ID inserted: 3

How To Get the ID Column Auto-Incremented?

Many tables require an ID column to assign a unique ID number for each row in the table. For example, if you have a table to hold forum member profiles, you need an ID number to identify each member. To allow MySQL server to automatically assign a new ID number for each new record, you can define the ID column with AUTO_INCREMENT and PRIMARY KEY attributes as shown in the following sample script:


  include "mysql_connection.php";
  $sql = "CREATE TABLE fyi_users ("
      . " id INTEGER NOT NULL AUTO_INCREMENT"
      . ", name VARCHAR(80) NOT NULL"
      . ", email VARCHAR(80)"
      . ", time TIMESTAMP DEFAULT CURRENT_TIMESTAMP()"
      . ", PRIMARY KEY (id)"
      . ")";
  if (mysql_query($sql, $con)) {
    print("Table fyi_users created.\n");
  } else {
    print("Table creation failed.\n");
  }
  mysql_close($con);
?>
If you run this script, a new table will be created with ID column defined as auto-increment. The sample script below inserts two records with ID values assigned by MySQL server:


If you run this script, you will get something like this:

1 rows inserted.
1 rows inserted.
1, John King, 2006-07-01 23:02:39
2, Nancy Greenberg, 2006-07-01 23:02:39

How To Query Multiple Tables Jointly?

If you want to query information stored in multiple tables, you can use the SELECT statement with a WHERE condition to make an inner join. Assuming that you have 3 tables in a forum system: "users" for user profile, "forums" for forums information, and "posts" for postings, you can query all postings from a single user with a script as shown below:

  include "mysql_connection.php";
  $userID = 101;
  $sql = "SELECT posts.subject, posts.time, users.name,
    . " forums.title"
    . " FROM posts, users, forums"
    . " WHERE posts.userID = ".$userID
    . " AND posts.userID = users.id"
    . " AND posts.forumID = forums.id";
  $rs = mysql_query($sql, $con);
  while ($row = mysql_fetch_assoc($rs)) {
    print($row['subject'].", ".$row['time'].", "
      .$row['name'].", ".$row['title']."\n");
  }
  mysql_free_result($rs);
  mysql_close($con);
?>

How To Build WHERE Criteria with Web Form Search Fields?

If your PHP script is linked to a Web form which takes search key words for multiple data fields. For example, your Web form asks your visitor to search for Website links with a URL search field, a Website title search field, a description search field, and a comment search field.

Now you have to build a nice WHERE criteria string that meets the following requirements:
Search fields with no data entered by visitors should not be included in the criteria.
Search values entered by visitors should be trimmed to remove leading and trailing space characters.
Empty search values after trimming should not be included in the criteria.
Single quote (') characters in search values should be protected.
backslash (\) characters in search values should be protected.
The tutorial script below shows you a good sample that meets the above requirements:
" Joe's brother\'s ", "description"=>"c:\windows\system ", "comment"=>" best "); $sql = "SELECT * FROM siteLinks WHERE 1=1"; $url = getFormParam("url"); $title = getFormParam("title"); $description = getFormParam("description"); $comment = getFormParam("comment"); if (strlen($url) > 0) $sql .= " AND url LIKE '%".$url."%'"; if (strlen($title) > 0) $sql .= " AND title LIKE '%".$title."%'"; if (strlen($description) > 0) $sql .= " AND description LIKE '%".$description."%'"; if (strlen($comment) > 0) $sql .= " AND comment LIKE '%".$comment."%'"; print("SQL statement:\n"); print($sql."\n"); function getFormParam($p) { if (isset($_REQUEST[$p])) { return str_replace("\\", "\\\\", str_replace("'", "''", trim($_REQUEST[$p]))); } else { return ""; } } ?>
If you run this script, you will get something like this:
SQL statement:
SELECT * FROM siteLinks WHERE 1=1
  AND title LIKE '%Joe''s brother\\''s%'
  AND description LIKE '%c:\\windows\\system%'
  AND comment LIKE '%best%'
You should learn a couple of things in this script:
isset($_REQUEST[$p]) is used to detect if the visitor has actually entered any value or not to a field.
trim($s) is used to trim off leading and trailing space characters.
str_replace("'", "''",$s) is used to replace single quote (') characters with ('').
str_replace("\\", "\\\\",$s) is used to replace backslash (\) characters with (\\). You need to repeat backslashes because PHP string literals can not take backslashes as is.
getFormParam($p) is created do all the input value processing work in a single function. getFormParam($p) also makes sure that all input values are defined as strings, even if they are not defined.
The WHERE clause is initialized with a dummy condition "1=1", so that all other conditions can be prefixed with the key word "AND".
$_REQUEST() is created for testing purpose only. You need to remove it, when you move this script to a real Web page.
The final WHERE criteria generated in the output SQL statement seems to be correct.

How To Perform Key Word Search in Tables?

The simplest way to perform key word search is to use the SELECT statement with a LIKE operator in the WHERE clause. The LIKE operator allows you to match a text field with a keyword pattern specified as '%keyword%', where (%) represents any number of any characters. Any single quote (') in the keyword needs to be protected by replacing them with two single quotes (''). The tutorial exercise below shows you how to search for records whose "notes" contains "e":

  include "mysql_connection.php";
  $key = "e";
  $key = str_replace("'", "''", $key);
  $sql = "SELECT id, url, notes FROM fyi_links"
    . " WHERE notes LIKE '%".$key."%'";
  $rs = mysql_query($sql, $con);
  while ($row = mysql_fetch_assoc($rs)) {
    print($row['id'].", ".$row['url'].", "
    . $row['notes']."\n");
  }
  mysql_free_result($rs);
  mysql_close($con);
?>
If you run this script, you will get something like this:
102, dba.fyicenter.com, Nice site.
202, www.yahoo.com, It's another search engine!
301, netscape.com, Added long time ago!
302, myspace.com, Added today!

How To Display a Past Time in Days, Hours and Minutes?

You have seen a lots of Websites are displaying past times in days, hours and minutes. If you want to do this yourself, you can use the TIMEDIFF() SQL function. Note that the TIMEDIFF() function can only handle time range within 839 hours (about 33 days). So it works only for past times within one month or so.
The following tutorial exercise shows you how to use TIMEDIFF() to present a past time in days, hours, and minutes:

  include "mysql_connection.php";
  $pastTime = "2006-06-29 04:09:49";
  $sql = "SELECT HOUR(timeDiff) AS hours,"
    . " MINUTE(timeDiff) AS minutes FROM ("
    . " SELECT TIMEDIFF(NOW(), '".$pastTime."')"
    . " AS timeDiff FROM DUAL) subQuery";
  print("SQL = $sql\n");
  $rs = mysql_query($sql, $con);
  while ($row = mysql_fetch_assoc($rs)) {
    print("$pastTime was ".$row['hours']." hours, "
      . $row['minutes']." minutes ago.\n");
  }
  mysql_free_result($rs);
  $sql = "SELECT (HOUR(timeDiff) DIV 24) AS days,"
    . " (HOUR(timeDiff) MOD 24) AS hours,"
    . " MINUTE(timeDiff) AS minutes FROM ("
    . " SELECT TIMEDIFF(NOW(), '".$pastTime."')"
    . " AS timeDiff FROM DUAL) subQuery";
  print("SQL = $sql\n");
  $rs = mysql_query($sql, $con);
  while ($row = mysql_fetch_assoc($rs)) {
    print("$pastTime was ".$row['days']." days, "
      . $row['hours']." hours, "
      . $row['minutes']." minutes ago.\n");
  }
  mysql_free_result($rs);
  mysql_close($con);
?>

If today is you run this script, you will get something like this:
SQL = SELECT HOUR(timeDiff) AS hours,
   MINUTE(timeDiff) AS minutes FROM (
   SELECT TIMEDIFF(NOW(), '2006-06-29 04:09:49')
   AS timeDiff FROM DUAL) subQuery

2006-06-29 04:09:49 was 115 hours, 2 minutes ago.

SQL = SELECT (HOUR(timeDiff) DIV 24) AS days,
   (HOUR(timeDiff) MOD 24) AS hours,
   MINUTE(timeDiff) AS minutes FROM (
   SELECT TIMEDIFF(NOW(), '2006-06-29 04:09:49')
   AS timeDiff FROM DUAL) subQuery

2006-06-29 04:09:49 was 4 days, 19 hours, 2 minutes ago.
Warning again, this script only works if the past time is less than 33 days ago.

How To Quote Date and Time Values in SQL Statements?

If you want to provide date and time values in a SQL statement, you should write them in the format of "yyyy-mm-dd hh:mm:ss", and quoted with single quotes ('). The tutorial exercise below shows you two INSERT statements. The first one uses a hard-code date value. The second one uses the date() function to return a date value.

  include "mysql_connection.php";
  $notes = "Added long time ago!";
  $time = "1999-01-01 01:02:03";
  $sql = "INSERT INTO fyi_links (id, url, notes, time)"
      . " VALUES ("
      . " 301, 'netscape.com', '".$notes."', '".$time."')";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
  } else {
    print("SQL statement failed.\n");
  }
  $notes = "Added today!";
  $time = date("Y-m-d H:i:s");
  $sql = "INSERT INTO fyi_links (id, url, notes, time)"
      . " VALUES ("
      . " 302, 'myspace.com', '".$notes."', '".$time."')";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
  } else {
    print("SQL statement failed.\n");
  }
  mysql_close($con);
?>
If you run this script, you will get something like this:
1 rows inserted.
1 rows inserted.

How To Quote Text Values in SQL Statements?

Text values in SQL statements should be quoted with single quotes ('). If the text value contains a single quote ('), it should be protected by replacing it with two single quotes (''). In SQL language syntax, two single quotes represents one single quote in string literals. The tutorial exercise below shows you two INSERT statements. The first one will fail, because it has an un-protected single quote. The second one will be ok, because a str_replace() is used to replace (') with (''):

  include "mysql_connection.php";
  $notes = "It's a search engine!";
  $sql = "INSERT INTO fyi_links (id, url, notes) VALUES ("
      . " 201, 'www.google.com', '".$notes."')";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
  } else {
    print("SQL statement failed.\n");
  }

  $notes = "It's another search engine!";
  $notes = str_replace("'", "''", $notes);
  $sql = "INSERT INTO fyi_links (id, url, notes) VALUES ("
      . " 202, 'www.yahoo.com', '".$notes."')";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
  } else {
    print("SQL statement failed.\n");
  }
  mysql_close($con);
?>
If you run this script, you will get something like this:
SQL statement failed.
1 rows inserted.

How To Delete Existing Rows in a Table?

If you want to remove a row from a table, you can use the DELETE statement with a WHERE clause to identify the row. The following sample script deletes one row:

  include "mysql_connection.php";
  $sql = "DELETE FROM fyi_links WHERE id = 1102";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows deleted.\n");
  } else {
    print("SQL statement failed.\n");
  }
  mysql_close($con);
?>
If you run this script, you will get something like this:
1 rows deleted.

How To Update Existing Rows in a Table?

Updating existing rows in a table requires to run the UPDATE statement with a WHERE clause to identify the row. The following sample script updates one row with two new values:

  include "mysql_connection.php";
  $sql = "UPDATE fyi_links SET notes='Nice site.', counts=8"
    . " WHERE id = 102";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows updated.\n");
  } else {
    print("SQL statement failed.\n");
  }
  mysql_close($con);
?>
If you run this script, you will get something like this:
1 rows updated.

How To Break Output into Pages?

If you have a query that returns hundreds of rows, and you don't want to present all of them to your users on a single page. You can break output into multiple pages, and only present 10 rows per page like what Google Website is doing. To do this, you need to modify your query with the LIMIT clause to return rows starting from the correct row number, and limited to 10 rows in the output.
The tutorial exercise below shows you how to break output into pages with 2 rows per page. It also calcualtes the total number of pages with a simple query criteria and order by condition. As an example, rows for page number 2 are returned.


  include "mysql_connection.php";
  $rowsPerPage = 2;
  $where = " WHERE url LIKE '%co%'";
  $order = " ORDER BY time DESC";
  $curPage = 2;
  $start = ($curPage-1) * $rowsPerPage;
  $sql = "SELECT COUNT(*) AS count FROM fyi_links" . $where . $order;
  print("SQL = $sql\n");
  $rs = mysql_query($sql, $con);
  $row = mysql_fetch_assoc($rs);
  $numberOfPages = $row['count'] / $rowsPerPage;
  print("Number of pages = $numberOfPages\n");
  mysql_free_result($rs);
 
  $sql = "SELECT * FROM fyi_links" . $where . $order
    . " LIMIT ".$start.", ".$rowsPerPage;
  print("SQL = $sql\n");
  $rs = mysql_query($sql, $con);
  while ($row = mysql_fetch_assoc($rs)) {
    print($row['id'].", ".$row['url'].", "
    . $row['notes'].", ".$row['time']."\n");
  }
  mysql_free_result($rs);
  mysql_close($con);
?>
 

If you run this script, you will get something like this:
SQL = SELECT COUNT(*) AS count FROM fyi_links
   WHERE url LIKE '%co%' ORDER BY time DESC

Number of pages = 3

SQL = SELECT * FROM fyi_links WHERE url LIKE '%co%'
   ORDER BY time DESC LIMIT 2, 2

101, dev.fyicenter.com, , 2006-07-01 20:24:46
102, dba.fyicenter.com, Nice site., 2006-07-01 20:24:46

How To Query Tables and Loop through the Returning Rows?

The best way to query tables and loop through the returning rows is to run the SELECT statement with the mysql_query() function, catch the returning object as a result set, and loop through the result with the mysql_fetch_assoc() function in a while loop as shown in the following sample PHP script:


  include "mysql_connection.php";
  $sql = "SELECT id, url, time FROM fyi_links";
  $res = mysql_query($sql, $con);
  while ($row = mysql_fetch_assoc($res)) {
    print($row['id'].",".$row['url'].",".$row['time']."\n");
  }
  mysql_free_result($res);
  mysql_close($con);
?>
Using mysql_fetch_assoc() is better than other fetch functions, because it allows you to access field values by field names. If you run this script, you will see all rows from the fyi_links table are printed on the screen:


101, dev.fyicenter.com, 2006-07-01 22:29:02
102, dba.fyicenter.com, 2006-07-01 22:29:02
1101, dev.fyicenter.com, 2006-07-01 22:29:02
1102, dba.fyicenter.com, 2006-07-01 22:29:02

Don't forget to call mysql_free_result($res). It is important to free up result set objects as soon as you are done with them.

What Is a Result Set Object?

A result set object is a logical representation of data rows returned by mysql_query() function on SELECT statements. Every result set object has an internal pointer used to identify the current row in the result set. Once you get a result set object, you can use the following functions to retrieve detail information:

mysql_free_result($res) - Closes this result set object.
mysql_num_rows($res) - Returns the number rows in the result set.
mysql_num_fields($res) - Returns the number fields in the result set.
mysql_fetch_row($res) - Returns an array contains the current row indexed by field position numbers.
mysql_fetch_assoc($res) - Returns an array contains the current row indexed by field names.
mysql_fetch_array($res) - Returns an array contains the current row with double indexes: field position numbers and filed names.
mysql_fetch_lengths($res) - Returns an array contains lengths of all fields in the last row returned.
mysql_field_name($res, $i) - Returns the name of the field of the specified index.

How To Insert Multiple Rows with a SELECT Statement?

If want to insert rows into a table based on data rows from other tables, you can use a sub-query inside the INSERT statement as shown in the following script example:


  include "mysql_connection.php";
  $sql = "INSERT INTO fyi_links"
      . " SELECT id+1000, url, notes, counts, time"
      . " FROM fyi_links";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
  } else {
    print("SQL statement failed.\n");
  }
  mysql_close($con);
?>


If you run this script, you will get something like this:
2 rows inserted.

How To Fix the INSERT Command Denied Error?

The reason for getting the "1142: INSERT command denied" error is that your user accound does not have the INSERT privilege on the table or database. To resolve this error, you need to ask your MySQL DBA to grant you the right privilege.
Your DBA will need to run commands like these to grant you enough privileges :
   GRANT INSERT ON fyi.* TO dev;                            
   GRANT UPDATE ON fyi.* TO dev;                            
   GRANT DELETE ON fyi.* TO dev;                            
   GRANT SELECT ON fyi.* TO dev;                            
   GRANT CREATE ON fyi.* TO dev;                            
   GRANT DROP ON fyi.* TO dev;                              

Once you got the right privileges, run the following tutorial scrip again:



  include "mysql_connection.php";                           
                                                            
  $sql = "INSERT INTO fyi_links (id, url) VALUES ("         
      . " 101, 'dev.fyicenter.com')";                       
  if (mysql_query($sql, $con)) {                            
    print(mysql_affected_rows() . " rows inserted.\n");     
  } else {                                                  
    print("SQL statement failed with error:\n");            
    print(mysql_errno($con).": ".mysql_error($con)."\n");   
  }                                                         
                                                            
  $sql = "INSERT INTO fyi_links (id, url) VALUES ("         
      . " 102, 'dba.fyicenter.com')";                       
  if (mysql_query($sql, $con)) {                            
    print(mysql_affected_rows() . " rows inserted.\n");     
  } else {                                                  
    print("SQL statement failed with error:\n");            
    print(mysql_errno($con).": ".mysql_error($con)."\n");   
  }                                                         
                                                            
  mysql_close($con);                                        
?>                                                          
The script should return this:
 
1 rows inserted.                                            
1 rows inserted.                                            
 

How To Insert Data into an Existing Table?

If you want to insert a row of data into an existing table, you can use the INSERT INTO statement as shown in the following sample script:

include "mysql_connection.php";

  $sql = "INSERT INTO fyi_links (id, url) VALUES ("
      . " 101, 'dev.fyicenter.com')";
  if (mysql_query($sql, $con)) {
    print(mysql_affected_rows() . " rows inserted.\n");
  } else {
    print("SQL statement failed with error:\n");
    print(mysql_errno($con).": ".mysql_error($con)."\n");
  }

  mysql_close($con); 
?>

Remember that mysql_query() returns integer/FALSE on INSERT statements. If you run this script, you could get something like this:
SQL statement failed with error:                                          
1142: INSERT command denied to user 'dev'@'localhost'                     
   for table 'fyi_links'                                                  

How To Get the Number of Rows Selected or Affected by a SQL Statement?

There are two functions you can use the get the number of rows selected or affected by a SQL statement:

  • mysql_num_rows($res) - Returns the number of rows selected in a result set object returned from SELECT statement.
  • mysql_affected_rows() - Returns the number of rows affected by the last INSERT, UPDATE or DELETE statement.

How To Create a New Table?

If you want to create a table, you can run the CREATE TABLE statement as shown in the following sample script:


  include "mysql_connection.php";                        
                                                         
  $sql = "CREATE TABLE fyi_links ("                      
      . " id INTEGER NOT NULL"                           
      . ", url VARCHAR(80) NOT NULL"                     
      . ", notes VARCHAR(1024)"                          
      . ", counts INTEGER"                               
      . ", time TIMESTAMP DEFAULT CURRENT_TIMESTAMP()"   
      . ")";                                             
  if (mysql_query($sql, $con)) {                         
    print("Table fyi_links created.\n");                 
  } else {                                               
    print("Table creation failed with error:\n");        
    print(mysql_errno($con).": ".mysql_error($con)."\n");
  }                                                      
                                                         
  mysql_close($con);                                     
?>                                                       
Remember that mysql_query() returns TRUE/FALSE on CREATE statements. If you run this script, you will get something like this:
 Table fyi_links created.                                

How to configure Mercury Mail Server on wamp

If you use wamp for PHP/ MySQL development this article to configure an email server for testing locally on your PC may be handy. This article is about installing mercury mail server on wamp. First of all download Mercury/32 Mail Transport System for Win32 and NetWare Systems v4.72 www.pmail.com/downloads_s3_t.htm Mozilla Thu
If you use wamp for PHP/ MySQL development this article to configure an email server for testing locally on your PC may be handy.
This article is about installing mercury mail server on wamp. First of all download
1. Mercury/32 Mail Transport System for Win32 and NetWare Systems v4.72
www.pmail.com/downloads_s3_t.htm
2. Mozilla Thunderbird www.mozilla-europe.org/en/products/thunderbird/
3. Wamp (if you do not have it already) www.wampserver.com/en/download.php
Install Wamp. I have installed it in d:\wamp. It is important to install it in the topmost directory.
• SMTP: example.com
• Email: admin@example.com
Finish the wamp installation.
In your current windows installation locate the hosts file. In my system windows is installed in C drive and location is
C:\WINDOWS\system32\drivers\etc\
Open the hosts file with notepad and add the following three lines at the end of the file.
• 127.0.0.1 www.example.com # for browser access
• 127.0.0.1 mail.example.com #for email access
• 127.0.0.1 example.com #for mercury mail server
Locate the httpd conf file in your wamp installation. In my system the path is D:\wamp\bin\apache\Apache2.2.11\conf
Remove the line
ServerName localhost:80
Add the line
ServerName www.example.com:80
Now start the wamp server.
You should be able to access the wamp server by using www.example.com and http://localhost interchangeably.
Create a folder inside the wamp installation called MercuryMail.
Start the Mercury Mail Server Installation and give the installation path as D:\wamp\MercuryMail
Select New Installation
Select No Netware Support
Directory for Mercury/32 is D:\wamp\MercuryMail
Click on No Pegasus mail integration
In the Protocol Mail Section select
• MecuryS- SMTP Server module
• MercuryP- POP3 Server Module
• MercuryD-POP3 Client Module
• MercuryH- PH Query Server Module
• MercuryB-HTTP Web Server module
• Select MercuryE module for SMTP and enter the server: example.com
• Select a SMTP relaying mode : Normal
Once you have finished the installation You can start Mercury mail from Start-Programs Mercury for Win32 – Mercury for Win3
A mercury/32 window will open
Click on Widows – Tile to arrange it.
In D:\wamp\MercuryMail edit the mercury.ini file
In the line myname: localhost # Canonical name for this server
Replace localhost with example.com
Restart the mercury mail server.
In the mercury/32 window go the Configuration – manage local Users
Create two users.
Username: annu
Password: anu
Username: nitin
Password: nitin
Try to send a test mail through mercury/32 window.
Install Mozilla Thunderbird Setup 2 email accounts from Tools – Account settings
Server name will be mail.example.com while setting up accouts.
Try sending mail from annu@example.com to nitin@example.com.
It should work and you are done!

How to assign a virtual local domain name to your localhost

How To Assign a Virtual Local Domain Name To Your Localhost

Step by Step Instructions to Assign Multiple Virtual Domain Names and Websites to Your Localhost

With the help of this tutorial you can assign a virtual domain name to your localhost.

You can access your local website with your favourite name like http://mysite.web instead of http://localhost and also you can assign different virtual domain names to different local webistes.
Requirements:
• Apache webserver installed. It would be nice if you have WAMP server. This tutorial is based on WAMP server. But it works on any Apache server.
Procedure:
Part 1:
1. First go to location "C:\WINDOWS\system32\drivers\etc" directory.(or where you installed windows).
Then open "hosts" file with simple text editor like notepad.
2. You'll see "127.0.0.1 localhost" at the end of the file.
In the next line add your virtual domain name like the example shown below.
Here mysite.web is just my example. You can use anything you like.
127.0.0.1 mysite.web #this is virtual domain name.
3. Now save the hosts file. mysite.web is just an example. You can add anything like mywebsite.local and you can use any extension or no extension at all.
You can simply add mysite also.
4. Now test your virtual domain. Just type "http://mysite.web" You must see your wamp page or webservers defalut page. If not go through the process again.
NOTE: Don't use any real domain name like www.google.com or your own domain name if you have any. If you did so, you cannot that access the original remote site. This is because, 127.0.0.1 is loopback address, anything with that address will never leave your computer.

Part 2- Now some difficult part. Assigning this virtual domain name to your web site in your local server.
1. Open your httpd.conf file in conf directory of Apache webserver folder.
If you are using WAMP click on WAMP icon, go to Apache menu and select httpd.conf there.

2. Create a new folder mysite in your C:\>. And create a new page index.html. These are for testing purposes.
If you have a local website, specify the full path of website in below code.
3. Now add the following code at the end of the httpd.conf file.
NOTE: PLEASE TYPE IN THE CODE MANUALLY without comments, DON'T COPY AND PASTE.
NameVirtualHost 127.0.0.1

ServerName localhost
DocumentRoot "C:/wamp/www"                      #this is default wamp root for websites,



ServerName mysite.web                           #your virtual domain name
DocumentRoot "C:/mysite"                        #location of your site, no extenison needed.

                              #again location of your website
Order Allow,Deny
Allow from all

Save this file. Restart your WAMP server. Now type http://mysite.web You'll see the index page of mysite.
If you want another website, first add another virtual domain in hosts file as shown in part1.
And then copy and paste the following code at the end of httpd.conf file. Just change the virtual domain name, and locations of website.

ServerName mywebsite.web               #change this virtual domain name
DocumentRoot "C:/mywebsite"            #location of your site, change this.

               #again location of your website, change this
Order Allow,Deny
Allow from all


You can add as many websites as you wish. Just repeat the above procedure. And access all your local websites with your favorite name. It will be fun and will save lot of your time.