Дык! Мож будем сверяться с мануалом, с параметрами, прежде чем постить, а? Или это опечатка? В общем, ошибка в 6-м параметре DeviceIoControl.
чё пишут в мануале:
BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,
  LPDWORD lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);
....
nOutBufferSize 
[in] Size of the output buffer, 
in bytes.
а тут я вижу buf_len, что есть количество 16-ти разрядных слов в буфере, не байт. Ядро при локировании страничек честно локирует сколько просишь, buf_len байт. Что есть в 2 раза меньше нужного  

 .
надо бы buf_len*sizeof(WORD) или sizeof(buf) написать. 
Напиши, помогло или чё-то ещё?