You can use Ghost or anything like that if you have it, just don't forget the partition table afterwards
.
Hmm... You could just stick the drive in, format it and run XCOPY from one drive to another...
XCOPY C:\*.* D:\ /h /e /k /r
/h : Copies files with hidden and system file attributes. By default, xcopy does not copy hidden or system files.
/e : Copies all subdirectories, even if they are empty. Use /e with the /s and /t command-line options.
/k : Copies files and retains the read-only attribute on destination files if present on the source files. By default, xcopy removes the read-only attribute.
/r : Copies read-only files.
/x : Copies file audit settings and system access control list (SACL) information (implies /o). (Use with an NTFS drive)
/v : Verifies each file as it is written to the destination file to make sure that the destination files are identical to the source files. (Optional)
Or do the same with a bootable linux CD and the cp command (slower but again no filesystem changes need to be made)...
If you don't mind resizing the partition afterwards, you can make a bit-to-bit duplicate of the drive with MBR and all just by typing (form a linux boot cd):
dd if=/dev/hda of=/dev/hdb
That'll copy the mbr, partition table, etc. Then you just run partitionmagic or whatever and resize the partition to have all the extra free space. By far the fastest method.
You can also do this remotely if the big drive is in another system.
Source runs: dd if=/dev/hda | nc <ip address> <port>
Destionation runs: nc -l -p <port> | dd of=/dev/hda
The infile (the file that's read) is transferred over the network and written bit-by-bit to the other drive.