LPDWORD, LPWORD, DWORD etc

what exactly are those? I see them every where in some more "advanced" functions, such as RegCreateKeyEx etc, but I never really understood why exactly are they here or what they do, DWORD is unsigned long right? so why is there DWORD when we have unsigned long? also long is the same as int according to http://cplusplus.com/doc/tutorial/variables/ so why do we have long AND int when they have same size?

also from one old article I found here on cplusplus I found that PDWORD and LPDWORD are SAME = unsigned long* - why are here 2 of them?!

Those are variable types that you'll get very familiar with if you start coding using windows. They use Hungarian notation because it helps identify what the variable is supposed to be used for.
A lot of the redundancy is a holdover from when computers had less memory to work with. Some of the variables and functions that have become redundant are from way back when we were using 16 bit and 32 bit systems, but now most windows programming is focused on 64 bit systems. The reason for the redundancy is for reverse compatibility, many codes still have to operate on 32 bit systems so depending on what system your programs loaded on LPDWORD can either be a Long Pointer to an extended 32 bit variable or it can function as a regular 64 bit on a newer system.

I'm just starting in on Windows programming so someone correct me if I got anything wrong there.