You have to care about the ioctl code passed to DeviceIoControl. If the buffer method is direct io, your app provides the buffer pointer for output buffer, and the driver will use the buffer you passed to accumulate data from your port.
It the buffer method is buffered io, the driver will deposit the data in one internal buffer( io manager allocated ), and then copy the content to the buffer you specified in output buffer.
check the key words buffered io and direct io for detail info in msdn or Walter Oney's wdm book