Two problems. In your use of memset and memcpy, you pass &buffer, but should just pass buffer.

And this simply makes no sense:
memcpy(buffer, 0x90, buffer-strlen(shellcode));
The second param is...